如何保护包含NDEF消息的Mifare Classic标签?

Sve*_*ges 1 android nfc

用Android保护Mifare Ultralight很容易,有Ndef.makeReadonly()方法可以.但是Mifare Classic标签会返回Ndef.canMakeReadonly() == false,所以这是不可能的.我听说可以通过设置a或b键来读取或至少用密钥保护它.

MifareClassic技术中有这种方法: authenticateSectorWithKeyB(int sectorIndex, byte[] key)

有谁知道这是否可用于在mifare经典标签上发送只读消息的ndef消息?或者我怎样才能在标签上写一个ndef消息,然后以某种方式锁定新的写入?

Nil*_*nck 9

可以使用身份验证方法.

首先,这是Mifare Classic 4k的数据表:

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

您的重要章节是:

  • 3.6内存组织
  • 3.6.3部门预告片

简而言之,写保护的工作原理如下:

Mifare Classic分为4*16字节的扇区(仅适用于前1k左右......较高的块有点不同,但在规范中有记录).在这64个字节中,16个用于认证/保护.对于卡的每个扇区,您执行以下操作:

  1. 使用KeyA验证该扇区
  2. 阅读行业预告片.
  3. 修改扇区预告片的访问位.
  4. 将扇区预告片写回卡片.

Mifare Classics的KeyA值是:

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

对于未格式化的工厂新卡.

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

对于卡的第一部分

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

对于所有其他部门.

重要提示:您必须将原始KeyA密钥写回卡.如果这些与上面显示的键不同,则卡将不再符合Ndef标准.

对于修改的访问位,您有两种选择:

  1. 仅为KeyA启用Read.这将为您提供100%的写保护,无法撤销.

  2. 为KeyB启用读取,为KeyB启用读/写.还在KeyB中存储密钥.这将允许您使用密钥B对写保护扇区进行身份验证,以取消对卡的保护.

背景:Android将仅使用上面显示的KeyA值对Ndef格式的标签进行身份验证.Ndef检测代码不会自行尝试KeyB,因此您可以将KeyB用于自己的目的.