如何使用安卓手机作为DESFire阅读器访问MIFARE NFC卡?我计划在android手机上开发一个Android应用程序(用于支付)。
我想使用Android手机执行的DESFire操作(身份验证、读写)需要SAM卡,我想我可以使用HCE在手机中模拟SAM卡。
发布于 2014-10-08 15:24:29
因此,在安卓设备上,可以通过IsoDep类访问它们。因此,一旦获得标记句柄(Tag对象),就可以使用以下命令实例化IsoDep对象:
Tag tag = ... // (e.g. get from NFC discovery intent)
IsoDep isoDep = IsoDep.get(tag);您可以连接到该卡并使用IsoDep对象的transceive()方法向该卡发送命令(以及从该卡接收响应):
isoDep.connect();
byte[] response = isoDep.transsceive(command);您可以使用DESFire本机命令集、ISO包装本机命令集或DESFire /IEC7816-4命令集(有关更多详细信息,请参阅DESFire数据表)。由于一些设备上的存在检测的已知问题(自动发送读取的二进制APDU来检测标签是否仍然可用),我强烈建议使用APDU包装的本机命令集或ISO/IEC7816-4命令集(参见this question)。
现在,有问题的部分是 SAM。 SAM(安全访问模块)是一种安全智能卡芯片,它保存密钥并执行与 DESFire 卡通信的安全关键部分。 您不能简单地使用基于主机的卡仿真来“仿真”这样的 SAM。 这没有多大意义,因为 HCE 的整个想法是通过 NFC 接口将非接触式智能卡读卡器的通信路由到(不安全的)应用处理器。 在应用处理器上实现 SAM 功能会破坏专用 SAM 芯片的全部目的(即高安全级别)。 此外,为了模拟 SAM 功能,您不需要 HCE,因为您可以在应用程序中直接存储访问 DESFire 卡的凭据。
您可能拥有的一个选项是使用基于云的安全元素方法。 因此,您可以在服务器/云中拥有 SAM 功能,并通过您的应用程序将与您的 DESFire 卡的通信路由到该服务器。
byte[] command = receiveCommandFromBackend(); // receive command from server/cloud over the network
byte[] response = isoDep.transsceive(command);
sendResponseToBackend(response); // send response to server/cloud over the network总结一下:您不需要 HCE。 根据您的安全要求,您可以在应用程序中存储访问 DESFire 卡的凭据(请注意,攻击者可能能够提取该信息),或者您可以使用基于云的 SE 方法来转移安全关键部分 到在线后端系统(但这通常需要在与卡通信期间持续访问网络)。
另一种方法当然是在您的设备中使用本地安全元素,但这需要您可以访问它,这通常不容易/不可能。
发布于 2014-08-21 17:05:31
Mifare DESFire不是一种支付标准,你应该依靠ISO14443-4 (即ISO7816-4),至少所有的大公司都是这么做的。这些也是HCE所基于的标准。有一个基于DESFire的支付系统可能是非常具体的。DESFire的问题在于它是专有技术。使用HCE开发支付应用在安全性方面非常具有挑战性。
https://stackoverflow.com/questions/25376914
复制相似问题