1

如何使用 Android 手机作为 NFC 读卡器访问 MIFARE DESFire 卡?我打算在安卓手机上开发一个安卓应用程序(用于支付)。

我想使用 Android 手机执行的 DESFire 操作(身份验证、读取和写入)需要 SAM 卡,我想我可以使用 HCE 在手机中模拟该 SAM 卡。

4

2 回答 2

6

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 方法来转移安全关键部分到在线后端系统(但这通常需要在与卡通信期间持续访问网络)。

另一种方法当然是在您的设备中使用本地安全元素,但这需要您可以访问它,这通常不容易/不可能。

于 2014-10-08T07:24:28.580 回答
0

Mifare DESFire不是支付标准,你应该依赖ISO14443-4(即ISO7816-4),至少所有大牌都是这样做的。这些也是 HCE 所依据的标准。拥有一个基于 DESFire 的支付系统可能是非常具体的事情。DESFire 的问题在于它是专有技术。使用 HCE 开发支付应用程序在安全性方面非常具有挑战性。

于 2014-08-21T09:05:31.277 回答