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

时间:2011-05-16 20:17:15

标签: android nfc

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

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

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

1 个答案:

答案 0 :(得分:8)

可以使用身份验证方法。

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

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

您的重要章节是:

  • 3.6内存组织
  • 3.6.3 Sector Trailer

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

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

  1. 使用KeyA
  2. 验证扇区
  3. 阅读行业预告片。
  4. 修改扇区预告片的访问位。
  5. 将行业预告片写回卡片。
  6. Mifare Classics的KeyA值为:

      

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

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

      

    byte [] KEY_MIFARE_APPLICATION_DIRECTORY =     {(字节)0XA0,(字节)0xA1,(字节)0xA2,(字节)0xA3执行,(字节)0xA4,(字节)0xA5的};

    对于卡片的第一部分

      

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

    对于所有其他行业。

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

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

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

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

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