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

Android 如何保护包含NDEF消息的Mifare Classic标记?,android,nfc,Android,Nfc,使用Android很容易保护Mifare Ultralight,有Ndef.makeReadonly()方法。但是Mifare Classic标记返回Ndef.canMakeReadonly()==false,因此这是不可能的。我听说可以将这样的标签设置为只读,或者至少通过设置a或b键来保护它 MifareClassic技术中有这样一种方法:authenticateSectorWithKeyB(int-sectorIndex,byte[]key) 有人知道这是否可用于使mifare classi

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

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


有人知道这是否可用于使mifare classic标记上的ndef消息只读吗?或者,我如何才能将ndef消息写入标记,然后以某种方式锁定它以防止新写入?

可以使用身份验证方法

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

本课程的重要章节包括:

  • 3.6内存组织
  • 3.6.3扇形拖车
简而言之,写保护的工作原理如下:

Mifare Classic分为4*16字节的扇区(仅适用于前1k左右的数据块……较高的数据块略有不同,但这在规范中有说明)。在这64个字节中,有16个用于身份验证/保护。对于卡的每个扇区,请执行以下操作:

  • 使用KeyA对扇区进行身份验证
  • 阅读扇区预告片
  • 修改扇区尾部的访问位
  • 将扇区预告写入卡中
  • Mifare经典产品的KeyA值为:

    字节[]键\u默认值= {(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0xFF}

    对于未格式化的工厂新卡

    字节[]键\u MIFARE\u应用程序\u目录= {(字节)0xA0,(字节)0xA1,(字节)0xA2,(字节)0xA3,(字节)0xA4,(字节)0xA5}

    对于卡的第一个扇区

    字节[]键\u NFC\u论坛=
    {(字节)0xD3,(字节)0xF7,(字节)0xD3,(字节)0xF7,(字节)0xD3,(字节)0xF7}

    所有其他部门

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

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

  • 仅为KeyA启用读取。这将为您提供无法撤销的100%写保护

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


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

    可以使用身份验证方法

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

    本课程的重要章节包括:

    • 3.6内存组织
    • 3.6.3扇形拖车
    简而言之,写保护的工作原理如下:

    Mifare Classic分为4*16字节的扇区(仅适用于前1k左右的数据块……较高的数据块略有不同,但这在规范中有说明)。在这64个字节中,有16个用于身份验证/保护。对于卡的每个扇区,请执行以下操作:

  • 使用KeyA对扇区进行身份验证
  • 阅读扇区预告片
  • 修改扇区尾部的访问位
  • 将扇区预告写入卡中
  • Mifare经典产品的KeyA值为:

    字节[]键\u默认值= {(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0xFF,(字节)0xFF}

    对于未格式化的工厂新卡

    字节[]键\u MIFARE\u应用程序\u目录= {(字节)0xA0,(字节)0xA1,(字节)0xA2,(字节)0xA3,(字节)0xA4,(字节)0xA5}

    对于卡的第一个扇区

    字节[]键\u NFC\u论坛=
    {(字节)0xD3,(字节)0xF7,(字节)0xD3,(字节)0xF7,(字节)0xD3,(字节)0xF7}

    所有其他部门

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

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

  • 仅为KeyA启用读取。这将为您提供无法撤销的100%写保护

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


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

    谢谢您的回复。虽然这可能确实有效,但我发现它确实很复杂。有人知道Mifare标签将来是否也会支持使用makeReadOnly()的密码保护标签吗(例如,未来的Android版本?),或者有人知道有哪些库可以做到这一点吗?答案很好,ndef数据可以通过正常的ndef读写从多个受保护的块写入和读取吗?Ndef.writeNdefMessage写入并使用getNdefMessage获取消息?谢谢您的回复。虽然这可能确实有效,但我发现它确实很复杂。有人知道Mifare标签将来是否也会支持使用makeReadOnly()的密码保护标签吗(例如,未来的Android版本?),或者有人知道有哪些库可以做到这一点吗?答案很好,ndef数据可以通过正常的ndef读写从多个受保护的块写入和读取吗?Ndef.writeNdefMessage写入并使用getNdefMessage获取消息?