【问题标题】:How can I read the NFC ID of another Android device?如何读取另一台 Android 设备的 NFC ID?
【发布时间】:2016-03-28 14:00:00
【问题描述】:

我想将 NFC 标签 ID 从一台 Android 设备交换(或仅读取)到另一台设备,但我不知道我应该使用点对点模式还是使用 HCE 模拟 NFC 标签。

如果我使用 HCE,模拟标签 ID 是否唯一?

什么是更好的选择,还是有更简单的选择?

【问题讨论】:

    标签: android nfc uniqueidentifier hce nfc-p2p


    【解决方案1】:

    P2P 和 HCE 都不会为您提供唯一 ID,至少在我所知道的任何手机上都不会。对于 P2P,要求在 ATR 中交换的 ID 是随机的。对于 HCE,仿真标签 ID 通常设置为 08h 加上一个随机数。可能需要设置 API 调用,但我不知道。但是,手机不能被任何阅读的人唯一识别,这很有意义。

    【讨论】:

      【解决方案2】:

      如何读取其他 Android 设备的 NFC ID?

      我假设您在这里谈论的是防冲突标识符/UID。在正在阅读的Android设备上,您可以使用reader-mode API访问HCE模式的设备:

      nfcAdapter.enableReaderMode(this, new NfcAdapter.ReaderCallback() {
          public void onTagDiscovered (Tag tag) {
              byte[] uid = tag.getId();
              // TODO: do something with the UID ...
          }
      }, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);
      

      模拟的标签 ID 是否唯一?

      Stephen's answer。通常,P2P 模式和 HCE 都不应提供唯一且稳定的 ID。但是,有一些例外情况,并且不稳定的 ID 更改的时间点可能会有所不同(另请参阅this answer)。可能是这样的:

      • 设备具有安全元件并使用该安全元件的静态 UID。
      • 设备在开机时会生成一个新的随机 UID,但会继续使用相同的 UID,直到关机。
      • 每次外部读取器设备激活时,设备都会生成一个新的随机 UID。 IE。每当向 Android 设备的 NFC 天线施加外部 HF 场时。

      另请注意,某些 NFC 设备将使用不以随机前缀 0x08 开头的随机生成的 UID。

      我可以强制设备使用固定/稳定的 UID 吗?

      Android 没有提供 API 来影响 UID/防碰撞标识符,所以简短的回答是 no。但是,如果可以选择生根或创建自定义 ROM,则可以更改 UID 和其他协议参数:

      是否应该使用 UID 来识别(甚至验证)设备?

      不,您绝对不应该这样做。当您尝试将 HCE 设备集成到某些旧系统时,有时您没有太多选择,但您绝对应该考虑不同的设计。

      首先,作为Stephen already wrote,如果 NFC 设备暴露了一个固定/稳定的标识符,这可能会引入隐私问题,因为任何人都可以读取和跟踪 ID。

      其次,虽然许多系统仍然使用这些 ID 来验证(!)卡,但 UID 不一定是唯一的(特别是 4 字节的 UID 比卡少)并且 UID 很容易被克隆。详情请见this answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-30
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多