【问题标题】:How well does the Android NFC API support Mifare Desfire?Android NFC API 对 Mifare Desfire 的支持程度如何?
【发布时间】:2012-07-17 13:40:52
【问题描述】:

我可能正在开展一个项目,将现有的 Desfire 卡(用于访问付费服务)替换为支持 NFC 的移动设备。任何人都可以向我指出任何资源以帮助我了解 a) 将 Desfire 卡的数据复制到移动设备上,以便它可以代替卡,以及 b) 应用程序提供 NFC 数据以呈现给读卡器就像一张卡片。所有相关的密钥和访问权限都将由发卡机构提供(如果项目进行的话),但我很想提前了解这个过程。

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

【问题讨论】:

    标签: android nfc mifare


    【解决方案1】:

    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。但是,这与卡和读卡器之间使用的协议不同。

    【讨论】:

    • 非常感谢您的解释。您是否愿意接受一些咨询(现在或将来)?如果是这样,请给我发电子邮件 ollie AT novoda.com
    • DESFire 无法在 Android 设备上锁定。您可以读/写它们,但不能锁定它们。
    • 没有DESFire锁定这样的概念。但是,您可以使用 DESFire 应用程序和/或 DESFire 应用程序中的文件的身份验证密钥来配置访问控制。
    • “安全元件无法模拟 DESFire 芯片” 为什么会这样?我们在谈论什么样的安全元素?
    • DESFire 有自己的命令集,它与 ISO 7816-4 APDU 不兼容,这通常是安全元件所做的(例如基于 JavaCard 的)。向这样的安全元件发送这样的 DESfire 命令通常不会被它接受。
    【解决方案2】:

    NFC 家伙的回答非​​常好,但有点过时,所以我决定添加更新。

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

    它被称为基于主机的卡模拟 (Hce),通过它您可以模拟 ISO 14443 A 类卡。就像 desfire 卡一样。

    有两个小警告:

    • 您的阅读器必须在轮询“卡”后立即发布一个 ISO SELECT (aid),并带有您选择的固定应用程序 ID (aid)。此 AID 必须在您的应用清单中注册。 Android 将拦截此 ISO SELECT,阅读帮助,并仅在它与您的清单中的那个匹配时才给您打电话。 然后你可以交换任何东西,它甚至不必是 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 读取去火卡),所以对我们来说很容易。

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

    【讨论】:

    • 请记住,如果您想支持(现有)DESFire 卡和(新)HCE 应用程序的混合系统,这可能会很棘手,因为两者之间存在差异。特别是需要发送 ISO Select 来激活 Android HCE 应用可能会与使用 DESFire 卡发生冲突。
    • 没错,这可能很棘手。但是 DESFire 卡(至少是我这里的 EV1)支持一组有限的 ISO 命令。 ISO SELECT 就是其中之一:卡正确处理它。我只需要用 ISO SELECT (0x00 0xA4) 替换我的第一个 DESFire 选择 (0x5A AID)。该卡以相同的方式执行,我让 android HCE 高兴:)
    • 问题是 1) 您可能无法触摸您的耦合器/读取器应用程序 2) 您必须在软件中重新实现所有 desfire 命令.. 这可能没有意义(为什么使用0xCD 用于借记,当你必须在 sw 中实现它时?)
    【解决方案3】:

    鉴于您的情况,我会说 Android SDK 足以解决您的问题。 您的案例分为两部分:

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

    第 1 部分:

    您唯一需要担心的是读取 DESFire 卡。如果 DESFire 卡中的信息以 NDEF 格式存储,事情就更简单了。

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

    以上假设卡不受保护。如果是,那么您必须使用transceive 函数来使用原始字节通信进行交互。这将为要读取的其余信息解锁。从这里您可以读取 NDEF 记录。

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

    如果在现有解决方案中一直在读卡的设备连接到 Android 设备,那么 Android Beam 是要走的路。这不过是 Android App 到 Android App 的通信! Android 已经完成了繁重的工作,因此您的大部分工作都将变得很容易。

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

    【讨论】:

      【解决方案4】:

      您可能想看看 Mifare4Mobile,该计划旨在从 Mifare 卡过渡到 NFC 设备:

      http://mifare4mobile.org/

      【讨论】:

      • 这是 NXP 的专有软件。看起来他们甚至让你在使用它之前签署 NDA 类型的协议。当心,三思而后行!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      相关资源
      最近更新 更多