基于主机的卡模拟技术与固定卡ID

12

Android 4.4引入了基于主机的卡片模拟技术(Host-based Card Emulation,HCE)。众所周知,所有NFC卡都有一个固定的卡片ID(NfcAdapter.EXTRA_ID)。

我的办公室门通常通过检测NFC卡的ID进行授权访问。将手机升级到KitKat后,我尝试使用门禁读卡器扫描我的手机。但每当屏幕关闭并重新打开后,我都会得到不同的卡片ID。

我试着让手机屏幕保持开启状态,并将模拟的卡片ID注册到门禁系统中。这成功地授予了访问权限以打开门。但当屏幕再次关闭并重新打开时,这种方法就不起作用了。

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

有什么办法可以使手机模拟的卡片ID保持固定吗?


1
请您能否发布您的代码?我知道有一个新的参数4.4,requiresDeviceUnlock。您是否尝试将其更改为false/true? - Pete
没有人会让你模拟自定义卡片UID,至少官方不会,因为这将破坏大多数RFID、NFC门禁系统的安全性!但我非常非常确定,如果你降低了级别,这将变得非常容易。 - Saw
我非常热衷于在Google Play商店上看到一个完整的卡片模拟器(带有卡片UID),并且我希望成为它的开发者!! - Saw
没有 UID 模拟的任何模拟器应用都是垃圾!! - Saw
4个回答

15

12

根据负责HCE的一位Google开发者所说:

很抱歉,我知道许多人想要这个功能,但在官方版本中不可能实现。(当然,你可以通过一些AOSP黑客手段来实现)。原因是HCE是围绕着后台操作设计的。如果我们允许应用程序设置UID,则每个应用程序可能都想设置自己的UID,并且没有解决冲突的方法。我们希望随着HCE的推出,NFC基础设施将向协议栈的更高级别移动,以进行身份验证,而不是依赖于UID(它很容易被复制)。


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


3
可以。至少有两种方法可以获得静态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的系统不安全。最好使用具有加密功能的系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接