¿Cómo puedo proteger una etiqueta Mifare Classic que contiene un mensaje NDEF?

Es fácil proteger un Mifare Ultralight con Android, existe la Ndef.makeReadonly() método para eso. Pero las etiquetas Mifare Classic vuelven Ndef.canMakeReadonly() == false, por lo que esto no es posible. Escuché que uno puede hacer que una etiqueta de este tipo sea de solo lectura o al menos protegerla con una clave configurando las teclas aob

Hay este metid en la tecnología MifareClassic: authenticateSectorWithKeyB(int sectorIndex, byte[] key)

¿Alguien sabe si esto se puede usar para hacer que un mensaje ndef en una etiqueta clásica mifare sea de solo lectura? ¿O de qué otra manera podría escribir un mensaje ndef en la etiqueta y luego bloquearlo de alguna manera contra nuevas escrituras?

preguntado el 16 de mayo de 11 a las 20:05

1 Respuestas

Es posible utilizar los métodos de autenticación.

Primero, aquí está la hoja de datos del Mifare Classic 4k:

http://www.nxp.com/documents/data_sheet/MF1S703x.pdf

Los capítulos importantes para ti son:

  • 3.6 Organización de la memoria
  • 3.6.3 Remolque sectorial

En resumen, una protección contra escritura funciona así:

El Mifare Classic está dividido en sectores de 4 * 16 bytes cada uno (solo se aplica a los primeros 1k más o menos ... los bloques superiores son un poco diferentes, pero eso está documentado en la especificación). De estos 64 bytes, 16 se utilizan para autenticación / protección. Para cada sector de la tarjeta, haga lo siguiente:

  1. Autenticar el sector usando KeyA
  2. Lea el tráiler del sector.
  3. Modifique los bits de acceso del tráiler de sector.
  4. Escribe el tráiler del sector en la tarjeta.

Los valores de KeyA para Mifare Classics son:

byte [] KEY_DEFAULT = {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF};

Para tarjetas recién formateadas y nuevas de fábrica.

byte [] KEY_MIFARE_APPLICATION_DIRECTORY = {(byte) 0xA0, (byte) 0xA1, (byte) 0xA2, (byte) 0xA3, (byte) 0xA4, (byte) 0xA5};

Para el primer sector de la tarjeta

byte [] KEY_NFC_FORUM =
{(byte)0xD3,(byte)0xF7,(byte)0xD3,(byte)0xF7,(byte)0xD3,(byte)0xF7};

Para todos los demás sectores.

Importante: debe escribir las claves KeyA originales en la tarjeta. Si difieren de las claves que se muestran arriba, la tarjeta ya no será compatible con Ndef.

Para los bits de acceso modificados, tiene dos opciones:

  1. Solo habilite la lectura para KeyA. Esto le brindará una protección contra escritura del 100% que no se puede revocar.

  2. Habilite Lectura para KeyA y Lectura / Escritura para KeyB. También almacena una clave secreta en KeyB. Esto le permitirá autenticar un sector protegido contra escritura usando su clave B secreta para desproteger la tarjeta.

Antecedentes: Android solo autenticará una etiqueta con formato Ndef utilizando los valores KeyA que se muestran arriba. El código de detección de Ndef nunca prueba KeyB por sí solo, por lo tanto, puede usar KeyB para sus propios fines.

Respondido el 04 de Septiembre de 13 a las 18:09

Gracias por tu respuesta. Si bien esto seguramente puede funcionar, lo encuentro realmente complicado. ¿Alguien sabe si el soporte para etiquetas de protección de contraseña con makeReadOnly () también vendrá para Mifare Tags en el futuro (por ejemplo, una futura versión de Android?) O ¿alguien sabe de bibliotecas que harían esto? - Sven Haiges

Buena respuesta, ¿se pueden escribir y leer datos ndef desde múltiples bloques protegidos a través de la lectura y escritura normales de ndef? Ndef.writeNdefMessage para escribir y usar getNdefMessage para obtener el mensaje? - gaara87

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.