Android4.4引入了基于主机的卡仿真(HCE)。如您所知,所有NFC卡都带有固定卡ID (NfcAdapter.EXTRA_ID
)。
我的办公室门访问通常会检测到NFC卡的授权ID。在我的手机闪现到KitKat之后,我尝试用访问阅读器扫描我的手机。但是每当屏幕一次又一次关闭时,我就会得到一个不同的身份证。
我确实试着把手机屏幕打开,并将模拟的身份证注册到门禁系统。它设法批准了开门的权利。但在屏幕一次又一次关机后,这一点就行不通了。
自从KitKat推出HCE模式以来,我一直试图用手机来模拟我的门禁卡。
有什么办法让手机模拟身份证固定吗?
发布于 2013-11-11 12:14:23
这是不可能的(至少在官方API中是如此):
在交换的第一部分,HCE设备将显示它的UID;HCE设备应该被假定有一个随机的UID。这意味着在每次点击时,呈现给读者的UID将是一个随机生成的UID。因此,NFC读取器不应依赖HCE设备的UID作为身份验证或标识形式。
(http://developer.android.com/guide/topics/connectivity/nfc/hce.html#ProtocolParams)
发布于 2013-12-17 00:23:05
根据是谷歌负责HCE的开发人员之一:
对不起,我知道很多人都想要这个,但在官方版本中是不可能的。(你当然可以用一些AOSP黑客来做)。这是因为HCE是围绕后台操作而设计的。如果我们允许应用程序设置UID,那么每个应用程序都可能希望设置自己的UID,并且无法解决冲突。我们希望通过HCE,NFC基础设施将转移到协议栈的更高级别来进行身份验证,而不是依赖于UID (无论如何,UID很容易被克隆)。
发布于 2015-02-06 06:56:03
至少Broadcom的NFC控制器(例如在Nexus 5中使用)支持为防冲突标识符(UID)、ATQA和SAK字节设置任意值。但是,没有API来修改它们,所以唯一的方法就是修改libnfc库。
NFC的相关代码位于文件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防冲突期间使用的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 这里版本(但仍在进行中)。
https://stackoverflow.com/questions/19764476
复制相似问题