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

Jas*_*son 10 android uniqueidentifier nfc android-4.4-kitkat hce

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

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

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

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

任何使手机模拟卡ID固定的想法?

cha*_*rno 14

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

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

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


小智 11

负责HCE的谷歌开发人员称:

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


Mic*_*and 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);
Run Code Online (Sandbox Code Playgroud)

此代码当前设置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);
Run Code Online (Sandbox Code Playgroud)

你可以找到libnfc-NCI的更多的定制版本在这里(仍然工作在进步,虽然).