Android的NFC API对Mifare Desfire的支持如何?

8
我很可能会参与一个项目,该项目将使用支持NFC的移动设备替换用于访问付费服务的现有Desfire卡。请问是否有任何资源可以帮助我了解以下内容:a)将Desfire卡的数据复制到移动设备上,以便其取代卡;b)应用程序如何提供NFC数据,以便呈现给读卡器,就好像它是一张卡。如果该项目获得批准,所有相关键和访问权限将由卡发行方提供,但我想提前了解此过程。
同时,我还需要了解Android NFC API如何支持Desfire,因为据我所见,它仅能完全支持Classic。 http://developer.android.com/reference/android/nfc/tech/package-summary.html
4个回答

19

MIFARE DESFire符合ISO 14443-4标准。在Android中,对于ISO 14443-4(因此是MIFARE DESFire),支持由IsoDep类完成。你可以使用该类的transceive()方法发送任何DESFire命令。

此外,DESFire可以配置为符合NFC Forum类型4标签规范。在这种情况下,Android将自动读取标签上的任何NDEF消息并将其分派到一个意图中。因此,当扫描特定标签时,你可以使你的应用程序自动启动。(Android也可以格式化DESFire芯片以包含NDEF,并将NDEF数据写入其中。)

用移动NFC设备替代DESFire卡是另一回事。当前可用的Android设备上的卡模拟是由连接到NFC芯片的嵌入式安全元素完成的。Android应用程序不能模拟卡(也没有API可供此操作),安全元素也无法模拟DESFire芯片。此外,没有开放的API可让应用程序从一个应用程序中访问安全元素。

Android NFC应用程序与另一个设备(而不是卡)之间通过NFC进行通信的唯一方式是使用Android Beam。然而,这是一种与卡和读卡器之间使用的不同协议。


非常感谢您的解释。您是否需要一些咨询服务(现在或将来)?如果是,请给我发电子邮件 ollie AT novoda.com。 - Ollie C
DESFire 无法在 Android 设备上锁定。您可以读/写它们,但无法锁定它们。 - Fuzzy
2
在DESFire中,没有锁定的概念。然而,您可以使用认证密钥来配置DESFire应用程序和/或DESFire应用程序中的文件的访问控制。 - NFC guy
安全元件无法模拟DESFire芯片。为什么会这样?我们正在谈论什么类型的安全元件? - LukaCiko
DESFire有自己的命令集,与ISO 7816-4 APDU不兼容,这通常是安全元件所做的(例如基于JavaCard的安全元件)。将此类DESfire命令发送到此类安全元件通常不会被其接受。 - NFC guy
如果你所说的“锁定”是指“更改密钥”,那当然可以做到。就像NFC团队所说,你可以重新配置访问控制。你只需要实现正确的Desfire命令(即找到命令代码并构建正确的PDU)。 - Lorenzo Dematté

18

NFC的回答很好,但有点过时,所以我决定添加更新。

从KitKat(4.4)开始,您现在可以模拟没有安全元素的卡片。

它被称为基于主机的卡片仿真(Hce),有了它,您可以仿真ISO 14443类型A的卡片。就像Desfire卡一样。

有两个小细节:

  • 读卡器必须在轮询“卡”后立即发出ISO SELECT(aid),其中包含您选择的固定应用程序ID(aid)。此AID必须在您的应用程序清单中注册。 Android将拦截此ISO SELECT,读取aid,并仅在匹配清单中的aid时调用您。 然后您可以交换任何内容,甚至不需要是ISO APDU(ISO 14443封装由Android完成)。因此,例如,如果您想要,甚至可以仿真Desfire的挑战响应身份验证(0xA0 key_num、0xAF challenge、0xAF response、0x00 session_key)

  • 您不能依赖UID(但您不会这样做,对吧?这是一个坏习惯,因此没有人这样做...对吧? :)),因为它是随机的,并且不断变化(当然,不是在单个会话内,但是...)

我们正在模拟我们的Desfire卡片,唯一需要做的更改是从最初的Desfire选择应用程序(0x5A)切换到ISO SELECT(0x00 0xA4 0x04)。

仿真身份验证(挑战响应)可能有些棘手,但我们已经以“另一种方式”(使用NFC读取Desfire卡)完成了它,因此对我们来说很容易。

如果您依赖卡UID进行身份验证...现在是更改它的好时机 :)


请注意,如果要支持(现有的)DESFire卡和(新的)HCE应用程序的混合系统,则可能会很棘手,因为两者之间存在差异。特别是需要发送ISO Select来激活Android HCE应用程序,很可能会与使用DESFire卡冲突。 - NFC guy
没错,这可能有点棘手。但是DESFire卡(至少我手头的EV1)支持有限的ISO命令集之一是ISO SELECT:卡正确地处理它。我只需要用ISO SELECT(0x00 0xA4)替换我的第一个DESFire select(0x5A AID),卡的表现方式相同,并且我让Android HCE感到高兴 :) - Lorenzo Dematté
问题在于:1)您可能无法触摸到您的耦合器/读卡器应用程序;2)您必须在软件中重新实现所有Desfire命令...这可能没有意义(为什么在您必须在软件中实现时使用0xCD进行借记?)。 - Lorenzo Dematté

1

根据您的情况,我认为Android SDK已经足够解决您的问题了。

您的案例有两个部分:

  1. 从现有卡片中读取信息。
  2. 使用您从卡片中读取的信息制作应用程序。

第一部分:

您唯一需要担心的是读取DESFire卡。如果DESFire卡中的信息以NDEF格式存储,则事情会更加容易。

Ndef是SDK中的一个类,可用于检索NdefMessage类型的信息,然后您可以将检索到的信息保存到您的存储设施中,无论是本地数据库、远程数据库还是仅在应用程序内存中。

以上是在假设卡未受保护的情况下。如果受保护,则必须使用transceive函数进行原始字节通信交互。这将解锁其余信息的读取。从这里,您可以读取NDEF记录。

第二部分:

我的建议是跳过模拟卡方面。您最终会遇到难题。

如果已有解决方案中读取卡的设备连接到了安卓设备,那么Android Beam就是最好的选择。这其实就是安卓应用程序之间的通信!安卓已经完成了大部分工作,所以你只需要做一些简单的工作。

卡上的信息可以存储为ndef消息并通过beam发送,或者你可以创建一个自定义对象并将其发送出去。


0

这是NXP的专有软件。在使用之前,他们似乎会让你签署类似于保密协议的协议。请小心并三思而后行! - mds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接