【问题标题】:Host-based Card Emulation with Fixed Card ID具有固定卡 ID 的基于主机的卡仿真
【发布时间】:2013-11-14 21:07:15
【问题描述】:

Android 4.4 引入了基于主机的卡仿真 (HCE)。如您所知,所有 NFC 卡都有一个固定的卡 ID (NfcAdapter.EXTRA_ID)。

我的办公室门禁通常会检测 NFC 卡 ID 以进行授权。将手机刷到 KitKat 后,我​​尝试使用访问阅读器扫描手机。但是每当屏幕关闭并再次打开时,我都会得到一个不同的卡 ID。

我确实尝试保持手机屏幕打开,并将模拟卡 ID 注册到门禁系统。它设法授予打开门的权限。但这在屏幕关闭并再次打开后将不起作用。

自从 KitKat 引入 HCE 模式以来,我一直在尝试使用手机模拟我的门禁卡。

有没有固定手机模拟卡 ID 的想法?

【问题讨论】:

  • 请您发布您的代码。我知道有一个新参数 4.4,requiresDeviceUnlock。您是否尝试将其更改为 false/true?
  • 没有人会让你模拟自定义卡 UID,至少在官方上,它会以某种方式破坏大多数 RFID、NFC 门禁系统的安全性!!!但我非常非常肯定,如果你降级,这很容易。
  • 在google play store看到一个全卡模拟器(有卡UID)很激动,希望能成为它的开发者!!
  • 任何没有UID模拟的模拟器应用都是垃圾!!

标签: android nfc android-4.4-kitkat uniqueidentifier hce


【解决方案1】:

这是不可能的(至少使用官方 API):

在交换的第一部分,HCE 设备将显示其 UID;应假定 HCE 设备具有随机 UID。这意味着在每次点击时,呈现给读者的 UID 将是一个随机生成的 UID。因此,NFC 读取器不应依赖 HCE 设备的 UID 作为身份验证或识别的一种形式。

(http://developer.android.com/guide/topics/connectivity/nfc/hce.html#ProtocolParams)

【讨论】:

    【解决方案2】:

    According to 负责 HCE 的 Google 开发人员之一:

    抱歉,我知道很多人都想要这个,但在正式版中是不可能的。 (你当然可以通过一些 AOSP 黑客来做到这一点)。原因是HCE是围绕后台操作设计的。如果我们允许应用程序设置 UID,那么每个应用程序都可能想要设置自己的 UID,并且没有办法解决冲突。我们希望通过 HCE,NFC 基础架构将移动到更高级别的协议栈来进行身份验证,而不是依赖 UID(无论如何都很容易克隆)。

    【讨论】:

      【解决方案3】:

      至少 Broadcom 的 NFC 控制器(例如在 Nexus 5 中使用)支持为防冲突标识符 (UID)、ATQA 和 SAK 字节设置任意值。但是,没有 API 可以更改它们,因此唯一的方法是修改 libnfc-nci 库。

      NFC-A 的相关代码在文件nfa_dm_discover.c 中(从第 322 行开始):

      UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD);
      UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD);
      UINT8_TO_STREAM (p, 0x04);
      UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG);
      UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG);
      UINT8_TO_STREAM (p, platform);
      UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO);
      UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO);
      UINT8_TO_STREAM (p, sens_info);
      

      此代码当前设置 ATQA(值平台和 0x04 的组合)和 SAK 字节(sens_info 的值)。

      为了改变NFC-A防碰撞时使用的UID,可以添加附加参数NFC_PMID_LA_NFCID1:

      UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1);
      UINT8_TO_STREAM (p, 4);  // length of NFCID1 in bytes
      UINT8_TO_STREAM (p, 0x12);
      UINT8_TO_STREAM (p, 0x34);
      UINT8_TO_STREAM (p, 0x56);
      UINT8_TO_STREAM (p, 0x78);
      

      您可以找到更可定制的 libnfc-nci here 版本(但仍在进行中)。

      【讨论】:

        【解决方案4】:

        这是可能的。至少有两种获取静态 UID 的方法:

        1. 并非所有手机在运行库存 ROM 时都会显示随机 UID。有些手机的静态 UID 为 01:02:03:04,即 LG G3、小米 Mi 3 和 Mi Mix 2s。但是,拥有这些手机的每个人都可以进入您的房间。

        2. 使用 Google Play 商店的 Card Emulator Pro,您可以模拟任何所需的 UID。您还可以切换,以便在屏幕关闭时保持 UID。

        仅依赖 UID 的系统并不安全。最好使用带加密的系统。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-28
          • 2015-01-07
          • 1970-01-01
          • 1970-01-01
          • 2013-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多