具有固定卡ID的基于主机的卡仿真

时间:2013-11-04 09:06:56

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:14)

这是(至少在官方API下)不可能:

  

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

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

答案 1 :(得分:11)

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

  

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

答案 2 :(得分:7)

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

答案 3 :(得分: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的系统并不安全。最好使用具有加密功能的系统。