12

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

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

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

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

修复手机模拟卡 ID 的任何想法?

4

4 回答 4

15

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

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

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

于 2013-11-11T12:14:23.027 回答
12

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

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

于 2013-12-17T00:23:05.127 回答
8

至少 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 版本(尽管仍在进行中)。

于 2015-02-06T06:56:03.350 回答
2

有可能的。至少有两种获取静态 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 的系统并不安全。最好使用带加密的系统。

于 2020-01-18T20:33:50.547 回答