1

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

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

有谁知道这是否可以用来使 mifare 经典标签上的 ndef 消息只读?或者我怎么能在标签上写一条 ndef 消息,然后以某种方式锁定它以防止新的写入?

4

1 回答 1

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};

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

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

对于卡的第一个扇区

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

对于所有其他部门。

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

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

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

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

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

于 2011-05-16T23:23:04.820 回答