我正在尝试锁定 Mifare Ultralight C 标签。我想将 NDEF 页 0x04 到 0x27 设置为只读。我认为这可以通过Ndef.makeReadonly()
.
此外,我想将页面 0x29 到 0x2F 设置为受密码保护(用于读取和写入),因此只有在身份验证成功后才能访问它们。我正在努力理解哪些字节需要在锁定字节(第 0x28 页,字节 0、1)中设置,以及是否还需要设置扇区 0x2A 和 0x2B。
不一定,Ndef.makeReadonly()
可能只在能力容器中设置只读标志(根据 NFC Forum Type 2 Tag Operation 规范)。
如果您想确保设置实际的锁定位,您可以将标签连接为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:锁定特定页面以获取锁定位的编码。
使用我上面显示的写入命令,您首先将身份验证密钥写入第 44..47 页。然后将 AUTH1(第 43 页)写为全零。最后,您将编写 AUTH0(第 42 页)0x29 0x00 0x00 0x00
以要求对第 41 页及更高版本进行身份验证。实际上,我建议锁定第 40 页及以上,以便没有人可以为这些页面设置锁定位。或者,您可以设置块锁定位(即写入0x1F 0x0F 0x00 0x00
第 40 页),以便无法更改未锁定页面的锁定位。