我正在尝试锁定Mifare Ultralight C标签。我想将NDEF页面0x04设置为0x27为只读。我认为这可以通过Ndef.makeReadonly()
实现。
此外,我想将页面0x29设置为0x2F以进行密码保护(用于读取和写入),因此只有在身份验证成功后才能访问它们。我很难理解需要在锁定字节(页面0x28,字节0,1)中设置哪些字节,以及是否需要设置扇区0x2A和0x2B。
答案 0 :(得分:3)
不一定,Ndef.makeReadonly()
可能只在功能容器中设置只读标志(根据NFC论坛类型2标签操作规范)。
如果要确保设置实际的锁定位,可以将标记连接为NfcA
或MifareUltralight
标记技术,然后发出锁定位的写入命令。
NfcA nfcA = NfcA.get(tag);
nfcA.connect();
byte[] result1 = nfcA.transceive(new byte[] {
(byte)0xA2, /* CMD = WRITE */
(byte)0x02, /* PAGE = 2 */
(byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF /* DATA = lock pages 3..15 */
});
byte[] result2 = nfcA.transceive(new byte[] {
(byte)0xA2, /* CMD = WRITE */
(byte)0x28, /* PAGE = 40 */
(byte)0x0F, (byte)0x00, (byte)0x00, (byte)0x00 /* DATA = lock pages 16..27 */
});
另请参阅Mifare Ultralight: lock specific pages了解lockbits的编码。
使用我上面显示的write命令,您首先要将您的身份验证密钥写入44..47页。然后,您将AUTH1(第43页)写为全零。最后,您将AUTH0(第42页)写为0x29 0x00 0x00 0x00
,以要求对页面41及更高版本进行身份验证。实际上我建议锁定40页以上的页面,以便没有人可以为这些页面设置锁定位。或者,您可以设置块锁定位(即将0x1F 0x0F 0x00 0x00
写入第40页),以便无法更改未锁定页面的锁定位。