Android NFC API如何支持Mifare Desfire?

问题描述:

我很可能正在开发一个项目,其中现有的Desfire卡(用于访问付费服务)将替换为支持NFC的移动设备。任何人都可以向我指出任何资源,以帮助我理解a)将Desfire卡的数据复制到移动设备上的过程,从而取代卡,并且b)让应用程序提供NFC数据以呈现给读者就好像是一张卡片。所有相关密钥和访问都将由发卡机构提供(如果项目继续进行),但我希望提前了解该过程。Android NFC API如何支持Mifare Desfire?

我还需要了解Android NFC API如何支持Desfire,因为据我所见,只能正确支持Classic。 http://developer.android.com/reference/android/nfc/tech/package-summary.html

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

除此之外,DESFire可以配置为符合NFC论坛类型4标签。在这种情况下,Android会自动读取标签中的所有NDEF消息并以意向方式分发它。因此,您可以在扫描特定标签时自动启动您的应用。 (Android也可以格式化DESFire芯片以包含NDEF并向其写入NDEF数据。)

用移动NFC设备替换DESFire卡是另一回事。当前可用的Android设备上的卡仿真是通过连接到NFC芯片的嵌入式安全元件完成的。一个Android应用程序不能模拟一张卡片(这里也没有API),并且安全元件不能模拟一个DESFire芯片。此外,没有开放的API来从应用程序访问安全元件。

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

+0

非常感谢您的解释。你是否需要咨询(现在或将来)?如果是这样,请给我发电子邮件ollie AT novoda.com – 2012-07-17 15:55:28

+0

DESFire无法锁定在Android设备上。你可以读/写它们,但不能锁定它们。 – Fuzzy 2013-03-08 11:26:32

+2

没有像DESFire锁定这样的概念。但是,您可以使用DESFire应用程序的身份验证密钥和/或DESFire应用程序中的文件来配置访问控制。 – 2013-03-08 19:58:03

鉴于你的情况,我会说Android SDK足以解决你的问题。 您的情况有两个部分:

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

1部分:

你唯一担心的必须是在读的DESFire卡。如果DESFire卡中的信息以NDEF格式存储,则使事情变得更加简单。

Ndef是可用于检索NdefMessage类型,然后可以使用检索到的信息保存到存储设备的信息的SDK一类,无论是本地数据库或远程数据库,或者只是在应用程序内存中。

以上是假设该卡不受保护。如果是,则必须使用transceive函数使用原始字节通信进行交互。这将解锁其余的信息以供阅读。从这里你可以阅读NDEF记录。

第2部分: 我的建议是跳过它的卡仿真方面。你会在某个时间点撞墙。

如果已经读取现有解决方案中的卡的设备连接到Android设备,那么Android Beam就是要走的路。这不过是Android应用程序与Android应用程序的沟通! Android已经完成了繁重的工作,所以你的大部分工作都将变得简单。

卡上的信息可以存储为ndef消息并通过发送,或者您可以简单地创建自定义对象并发送。

你可能想看看Mifare4Mobile,主动设置为从MIFARE卡过渡到NFC设备:

http://mifare4mobile.org/

NFC家伙答案是优秀的,但有点过时了,所以我决定增加更新。

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

它被称为基于主机的卡片仿真(Hce),并且你可以模拟一个ISO 14443 A型卡片。就像一个灭火卡。

有两个小告诫:

  • 你的读者一定问题,轮询刚过 “卡”,一个ISO SELECT(援助),与您所选择的固定应用ID(AID)。此AID必须在您的应用清单中注册。 Android会拦截这个ISO SELECT,读取这个援助,并且只有在你的清单中的那个匹配时才打电话给你。 然后你可以交换任何东西,它甚至不必是ISO APDU(ISO 14443封装是由android完成的)。因此,例如,如果你想,你甚至可以效仿的DESFire(0XA0 KEY_NUM,0xAF执行挑战,0xAF执行响应,为0x00 session_key可以)的质询响应认证

  • 你不能依靠UID(但你不这样做,对吗?这是一个不好的做法,所以没有人这样做......对吧?:)),因为它是随机的,并且它不断变化(当然不是在单个会话中,但是.. 。)

我们模仿我们的DESFire门禁卡,我们不得不这样做唯一的变化是从我们最初的DESFire选择应用程序(0x5A)切换到ISO SELECT(为0x0 0 0xA4 0x04)。模拟身份验证(挑战 - 响应事件)可能会非常棘手,但我们已经以“相反方式”(使用NFC来读取desfire卡)做到这一点,所以对我们来说很容易。

如果你依赖于卡的UID认证..这是一个很好的时间来改变它:)

+0

因为2之间的差异,这很棘手。特别是需要发送ISO Select来激活Android HCE应用程序可能会与使用DESFire卡片相冲突。 – 2014-11-06 21:19:48

+0

诚然,这可能会很棘手。但DESFire卡(至少,我在这里的EV1)支持一组有限的ISO命令。 ISO SELECT是其中之一:卡片处理正确。我只需要用ISO SELECT(0x00 0xA4)替代我的第一个DESFire select(0x5A AID)。该卡以相同的方式执行,并且我让android HCE高兴:) – 2014-11-07 10:22:19

+0

问题是:1)您可能无法触及您的耦合器/阅读器应用程序2)您必须在软件中重新实现所有的desfire命令。这可能没有意义(为什么使用0xCD作为借记卡时,您必须在sw中实现它?) – 2014-11-07 10:24:19