【问题标题】:How to write protect an NTAG203 NFC chip programmatically on android?如何在 android 上以编程方式写保护 NTAG203 NFC 芯片?
【发布时间】:2015-01-23 10:07:27
【问题描述】:

我一直在研究用于会员卡解决方案的 NTAG203 NFC 芯片,并打算在每张卡上设置和写入唯一 ID。

奇怪的是,我在网上找不到太多关于如何写保护 NTAG203 芯片的信息,尽管我可以找到正在出售的写保护芯片。我还看到了提供写保护服务的应用程序。

如何编写 Android 应用程序以在 NTAG203 上启用写保护?

谢谢!

(为清楚起见,已编辑问题)

【问题讨论】:

  • “以编程方式”但“不使用应用程序”是什么意思?您可以通过一些软件使用连接到 PC 的阅读器。
  • 抱歉 - 不是很清楚 - 我的意思是我正在寻找一种可以编码到我自己的 android 应用程序中的方法。我想省略建议使用第三方应用程序的答案。 - 已更新问题。

标签: android tags nfc mifare lockbits


【解决方案1】:

是的,这是可能的。 NTAG203 (datasheet) 是一个 ISO/IEC 14443 Type A ("NFC-A") 标签,遵循 NFC Forum Type 2 标签操作规范。为了激活此类标签的物理写保护功能,您需要设置锁定位。

在 Android 上,您可以通过为您的标签句柄获取 NfcA 技术连接器类的实例来访问此类标签:

Tag tag = ...  // I assume you already received the tag handle by means of an NFC discovery intent
NfcA nfcA = NfcA.get(tag);
if (nfcA != null) {
    // this is an NFC-A tag
    ...

NTAG203 的锁定位位于第 2 页 (0x02) 字节 2-3 和第 40 页 (0x28) 字节 0-1。这 4 个字节的每一位都控制 NTAG203 内存区域的某些页面的锁定状态。为了激活锁定,您必须通过对包含锁定位的页面发出写入命令来将锁定位设置为'1'。因此,对于锁定整个标签的最简单方案,您可以执行以下操作:

    // connect to the tag
    nfcA.connect();

    byte[] result;
    // write all-ones to the lock bits on page 0x02
    result = nfcA.transceive(new byte[]{
            (byte)0xA2,  // Command: WRITE
            (byte)0x02,  // Address: page 0x02 (2)
            (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF  // Data: set bytes 2-3 to all '1'
    });
    // write all-ones to the lock bits on page 0x28
    result = nfcA.transceive(new byte[]{
            (byte)0xA2,  // Command: WRITE
            (byte)0x02,  // Address: page 0x28 (40)
            (byte)0xFF, (byte)0x11, (byte)0x00, (byte)0x00  // Data: set byte 0 and lock bits in byte 1 to all '1'
    });

    nfcA.close();

【讨论】:

  • 为了完整起见:您可以使用makeReadOnly() 将 NDEF 消息定义为 NFC/NDEF 级别的只读消息。然而,这不如 Michael Roland 描述的方法安全。但是使用makeReadOnly() 可以在所有类型的 NFC 芯片上使用,而设置锁定位取决于芯片类型。
  • 正确,但您应该注意makeReadOnly() 不适用于设备和标签的所有组合。此外,它不一定设置标签的实际锁定位。
  • makeReadOnly() 在 CC 中设置一个位。这应该包含在 NFC 标准中,并且应该适用于所有符合标准的芯片。是否有任何设备在其 API 中不支持此功能?
  • 我的评论的意思是在功能容器中设置一个标志来告诉读者“不要写入这个标签”并不是真正的锁定内存 .此外,Android 的 libnfc-* 库中的makeReadOnly() 并未针对所有标签类型实现。
  • Michael,很明显使用标志的安全级别很弱。它只是减少了深入研究可能使用的芯片数据表的需要。但我不知道并非所有标签类型都支持makereadOnly(),感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
相关资源
最近更新 更多