设置NTAG213的密码

luk*_*spp 3 authentication android nfc mifare xamarin

我正在尝试设置并检查 NFC 标签(类型:NTAG213)中的密码,但当我IOException尝试设置它时,我总是收到(收发失败)。

我不明白我必须在哪个页面设置密码和 ACK 包。这是我用 C# 和 Xamarin 编写的代码。请随时用原生 Android Java 代码回复。

var tag = intent.GetParcelableExtra (NfcAdapter.ExtraTag) as Tag;

String password = "pass";
byte[] array = System.Text.Encoding.ASCII.GetBytes (password);
MifareUltralight mifare = MifareUltralight.Get (tag);
mifare.Connect ();

byte[] result1 = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2C,  /* PAGE = 44 */
        array[0], array[1], array[2], array[3] 
});

byte[] result2 = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2A,  /* PAGE = 42 */
        (byte)array[0], (byte)array[1], (byte)0, (byte)0 
});
Run Code Online (Sandbox Code Playgroud)

Mic*_*and 5

对于 NTAG213,密码 (PWD) 和密码确认 (PACK) 的正确页面为:

  • 密码: 43 ( 0x2B)
  • 包装:44 ( 0x2C)

因此,您试图写入错误的页面。更具体地说,您尝试将非零值写入 RFUI 字节(第 44 页,字节 2-3 和第 42 页,字节 1-3),这可能会导致写入操作失败。

所以你通常会想做这样的事情:

byte[] pwd = new byte[] { (byte)0x70, (byte)0x61, (byte)0x73, (byte)0x73 };
byte[] pack = new byte[] { (byte)0x98, (byte)0x76 };

// write PACK:
byte[] result = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2C,  /* PAGE = 44 */
        pack[0], pack[1], 0, 0
});

// write PWD:
result = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2B,  /* PAGE = 43 */
        pwd[0], pwd[1], pwd[2], pwd[3]
});
Run Code Online (Sandbox Code Playgroud)

请注意,让 PACK 成为 PWD 的子集没有多大意义,因为攻击者随后能够从 PWD 值获取 PACK 值。PACK 值通常用作只有您和标签“知道”的共享秘密,并且标签响应成功的身份验证尝试而发送该秘密,以证明它是真正的标签。(尽管这种方法存在很多安全问题。)

IOException另请注意,如果标签已受保护(设置密码和身份验证配置以保护 PWD/PACK),则设置 PWD/PACK 值将会失败(可能带有)。在这些情况下,您需要首先使用当前密码进行身份验证。

  • 设置密码不足以保护标签,您必须相应地设置配置页面才能真正保护标签。 (2认同)
  • 请参阅 http://stackoverflow.com/a/22723250/2425802 并查阅 NTAG213 的数据表,了解配置值的正确页面地址。 (2认同)
  • 我通过将 Auth0 设置为 Lastpage (0xff) 来删除密码,所有内容都已写入文档中,但有了您的解释,就更容易理解所有内容了! (2认同)