如何使用 Android 手机作为 NFC 读卡器访问 MIFARE DESFire 卡?我打算在安卓手机上开发一个安卓应用程序(用于支付)。
我想使用 Android 手机执行的 DESFire 操作(身份验证、读取和写入)需要 SAM 卡,我想我可以使用 HCE 在手机中模拟该 SAM 卡。
如何使用 Android 手机作为 NFC 读卡器访问 MIFARE DESFire 卡?我打算在安卓手机上开发一个安卓应用程序(用于支付)。
我想使用 Android 手机执行的 DESFire 操作(身份验证、读取和写入)需要 SAM 卡,我想我可以使用 HCE 在手机中模拟该 SAM 卡。
DESFire/DESFire EV1 卡在 ISO/IEC 14443-4 数据交换协议 (ISO-DEP) 之上进行通信。因此,在 Android 设备上,可以通过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 本机命令集、DESFire APDU 包装本机命令集或 ISO/IEC 7816-4 命令集(有关详细信息,请参阅 DESFire 数据表)。由于某些设备上存在检测存在已知问题(它会自动发送 READ BINARY APDU 以检测标签是否仍然可用),我强烈建议使用 APDU 包装的本机命令集或 ISO/IEC 7816-4 命令集(见这个问题)。
现在,有问题的部分是 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 方法来转移安全关键部分到在线后端系统(但这通常需要在与卡通信期间持续访问网络)。
另一种方法当然是在您的设备中使用本地安全元素,但这需要您可以访问它,这通常不容易/不可能。
Mifare DESFire不是支付标准,你应该依赖ISO14443-4(即ISO7816-4),至少所有大牌都是这样做的。这些也是 HCE 所依据的标准。拥有一个基于 DESFire 的支付系统可能是非常具体的事情。DESFire 的问题在于它是专有技术。使用 HCE 开发支付应用程序在安全性方面非常具有挑战性。