我们如何从iPhone将银行卡加载到钥匙串中



每年,越来越多的公司对与物联网(IoT相关的项目表现出兴趣。 



在本文中,我将讨论我们创建的IoT平台,如何将银行卡加载到可穿戴设备中,探索Core NFC iOS框架的功能以及使用带有NFC的智能手机的可能的欺诈方案。



本文对从事移动支付的产品经理,技术人员,iOS开发人员,质量检查工程师以及对金融科技技术感兴趣的任何人都非常有用。



哈Ha!



我叫马克西姆。我从2005年开始从事工业发展。自2013年以来,我一直在电子钱包工作,自2015年以来,我作为部门负责人一直在帮助该公司的业务开发新的金融科技服务。



在电子钱包中,我们的团队推出了许多创新产品。这是智能手机中世界上最早的完全虚拟银行卡之一,可以进行非接触式支付(在俄罗斯Apple Pay推出前一年,而Apple Card推出很久之前),智能手机中第一张交通卡,第一张粉丝卡和第一张校园卡。 ...



去年,我们与万事达卡一起推出了电子钱包付款服务是世界上唯一与其他服务不同的服务,无论智能手机制造商或操作系统如何都可以运行。例如,Pay Wallet可在缺少Google服务的华为智能手机上使用。



致谢



科里亚·阿沙宁Kolya Ashanin)激励我写这篇文章,并在我准备出版时给予了帮助。



Sasha Pryimak在我的监督下进行了本文中所述的研究。



另外,非常感谢您的参与和支持:

Katya Turkina,Anton Davydov,Lesha Ershov,Dasha Alekseenko。



物联网平台



目前,我和我的团队正在努力开发一个物联网平台,该平台将能够补充和扩展使用Pay服务并在我们通常随身携带的东西(即所谓的可穿戴设备)中实现支付(和其他识别服务)的现有经验。 



物联网是一种熟悉的物理对象的概念,配备了与外部环境或彼此交互的技术。 



在此概念中,通过自动化来重建熟悉的用例。



可穿戴设备的一个例子是智能手表,健身手镯,戒指,钥匙扣。



如果以前人们是因为美感或象征意义而戴了戒指,那么现在在物联网的概念中,戒指就可以用作支付工具,是访问控制通行证,其他智能设备的远程控制等。因此,对于熟悉的事物出现了新的方便的用例。



如今,智能事物已成为全球趋势。世界各机构收集的统计数据证明了这一点(请参见文章末尾的链接)。 



在本文中,我想以我们在IoT平台开发中的研究示例为例,告诉您Wallet应用程序的金融科技方向所处理的任务,我们面临的问题以及我们如何使用卡业成熟的技术来创建新产品。



首先,我将简单扼要地描述平台所基于的技术。如果您有兴趣阅读有关这些技术的更多信息,那么本文结尾处将提供链接。 



  1. , Secure Element — , 5-20 . , -, , - , . , SIM-, . ( ).



    , — . , .
  2. GlobalPlatform Card Specification — , .
  3. TSM  (Trusted Service Manager) — . .
  4. EMV — ( ), . , - , , .


这是我们将智能手机与设备本身进行交互的主要场景,我们将其放入我们的平台中(在所有场景中,用户都通过智能手机上的移动应用程序的界面来控制可穿戴设备): 



第一个场景是与活动可穿戴设备的交互。有源设备是具有自己的电池(例如电池)的可穿戴设备。通常,事物具有其自己的操作系统,并且具有用于与智能手机通信的BLE模块。设备制造商提供了用于与安全元素进行交互的SDK和访问密钥。 



这就是所有具有非接触式支付功能的智能手表和健身手镯的工作原理,一切都很简单明了-我们接受并做到这一点。 



第二种情况更有趣与无源可穿戴设备进行交互。可穿戴设备称为无源设备,它们没有自己的电池。这些设备由必须放置在其中的外部磁场供电。这可能是非接触式终端阅读器或智能手机的NFC天线的电磁场。因此,非接触式银行卡可以安全地称为无源可穿戴设备。 



问题是您需要从智能手机上的应用程序将银行卡加载到无源可穿戴设备中。



我们(有条件地)根据智能手机的类型来打破这种情况:



  1. 任何没有NFC的智能手机
  2. 带有NFC的Android智能手机
  3. 带有NFC的iPhone


对于第一种类型,我们将使用位于特殊个性化终端中的外部读取器。简而言之,智能手机中的个性化终端和移动应用程序连接到同一个后端,这使两个客户端同步。令牌是通过个性化终端加载的,用户可以在移动应用程序界面中看到结果。



个性化终端的实现可能不同:它可以是通过BLE或USB连接到外部智能卡读取器的同一用户的智能手机,也可以是自主的外部设备(连接有读取器的成熟计算机,互联网访问和控制软件) ...



对于第二种类型(具有NFC的Android),实现是明确的。在这种情况下,智能手机可用作终端,通过NFC天线为无源设备供电,并向其中加载银行卡令牌。



在我们的研究中,我将详细描述我们如何在第三种智能手机(带NFC的iPhone)上工作。作为可穿戴设备,我们使用了ISBC的密钥,该合作伙伴将与我们一起启动试验。



这项研究的目的



我们可以通过将iOS电子钱包用户的银行卡连接到iPhone来使其银行卡加载到可穿戴设备中吗?



即:



  1. 用户在应用程序“钱包”中输入其银行卡的数据
  2. 用户将可穿戴设备靠在iPhone的背面
  3. 银行卡已装入可穿戴设备


因此,技术任务是确定是否可以通过ISO / IEC 7816协议(T = CL)使用常规iPhone及其NFC天线将银行卡加载到外部安全元件(安全元件)中。  其他任务:







  1. 无需从读取器中取出芯片即可获取芯片的ATR(复位响应)
  2. 获取芯片的UID(唯一标识符)


该数据很有用,因为它通常用于识别服务提供商系统中的芯片,并从芯片应用程序的敏感数据中分散密钥。



我们有什么:



  • 配备iOS 13.5的iPhone 8
  • 测试可穿戴设备-ISBC密钥卡,带有嵌入式JCOP 3 EMV P60芯片和NXP装载的小程序

    PPSE和实现M / Chip Advance-卡规格支付和数据存储v1.1的小程序;
  • 颁发者安全域芯片中的密钥。


决断



在开始时,我们将分解主要任务,即,我们将确定将完全普通的钥匙链(几乎)转变为成熟的付款方式所需的步骤:



  1. 在芯片和iPhoneNFC模块之间建立连接
  2. 在芯片上安装万事达卡M / Chip Advance和PPSE小程序
  3. 个性化小程序 


建立连接



在这里,我们将讨论iOS 13中添加Core NFC框架的功能。

顺便说一下,在iOS 14中,本文的主题没有发生重大变化,因此所描述的所有内容都与她有关。



因此,在Apple OS的第十三版中,不仅可以从iOS 12中的NFC标签读取数据(但不早于iOS 11,在此之前,只能在Apple Pay中通过NFC进行交互),而且还可以写入它们,并且还可以使用APDU命令语言与符合以下标准之一的任何芯片进行通信





为此核心NFC添加两个新类:NFCNDEFReaderSessionNFCTagReaderSession



第一个用于与NDEF标签进行交互,第二个分别用于其他所有操作



在我们的例子中,这是一个支持GlobalPlatform卡规范2.2.1ISO / IEC 7816标准的芯片,这意味着我们将使用第二类。



文档说明了根据ISO 7816开始与芯片进行通信所需要做的事情(当然,还包括编写代码):





但是下面有一个有趣的限制: 在了解了确切含义之后,我们只想“感觉”它。info.plist文件中NFCReaderUsageDescription键添加一行,例如“允许NFC连接” 它也可以与此键的任何其他值一起使用。 



Important

Core NFC doesn't support payment-related Application IDs.













[在这里,在左栏中,不是键本身,而是键的描述,XCode隐藏了正式名称。]



接下来,如果我们要像使用ISO / IEC 7816设备那样与芯片交互,则使用com.apple.developer.nfc.readersession键的值。 iso7816.select-identifiers 指定应用程序将与之交互的所有小程序的ID列表(应用程序标识符或AID)。                          





在这里值得澄清的是,这些标识符不仅仅是一组随机字符。

这些是十六进制字符串,其中包含有关为其分配了应用程序的信息。



AID的长度可以为5到16个字节(每行两个字符=一个字节)。它们由两部分组成,第一部分标识应用程序提供程序(对于万事达卡,它是“ A000000004”),第二部分说明了该提供程序是什么产品(对于名为“万事达卡”的产品,它是“ 1010”,例如对于Maestro,它是“ 3060”。 ”)。 



此外,有时需要在AID中放入其他信息,例如,如果芯片上有来自同一提供商的两个相同的应用程序,但用于不同的存储库。为此,支持长AID(或扩展AID)。只要AID的长度不超过16个字节,就可以向其中写入任何内容。例如,我们使用万事达卡AID,并在最后添加了“ TEST”,结果为:“ A0000000041010BB5445535401”。



列表中唯一的AID是“ 325041592E5359532E444446303101”。

实际上,这是通常的(仅以十六进制格式),正如他们所说的,纯文本字符串“ 2PAY.SYS.DDF01”。这是AID PPSE,它本身不是支付小程序。它仅包含付款应用程序所需的环境数据。



安装小程序



要将小程序安装在芯片上,需要安全连接(安全通道协议或SCP);我们使用传统的PC / SC读取器和Cardsmobile TSM平台在后台进行了此操作



但是,即使您没有这些,也仍然可以尝试在芯片上安装自己的applet-仅是虚拟applet。



您将需要具有JCOP Shell支持和JavaCard仿真器的任何IDE,例如this



创建一个空项目,指定所需的AID(例如0000000000)并运行。



然后我们了解了步骤:



  1. / card

    获取ATR,发送不带ID的SELECT,以便选择Card Manager;





  2. auth

    , ;



  3. ls ()

    , /;





  4. install [packageAID] [appletAID] [instanceAID]

    :



    packageAID — (Module), , «0000000000»

    appletAID — (Load File), , «000000000000»

    instanceAID — , , , «A0000000041010»;





  5. ls

    , :







实际上,个性化applet非常简单;所需要做的就是将所需的付款数据加载到其中。为此,请通过其AID使用SELECT命令选择小应用程序,建立安全连接,然后将包含数据的STORE DATA命令发送给选定的小应用程序。



现在,让我们返回到info.plist文件中的AID列表-为什么需要它,以及Core NFC如何精确地选择要与哪个小程序进行交互?



看起来像这样:



  1. 该程序从上到下遍历列表。
  2. 对于每个AID,它都会生成并发送一个SELECT命令。
  3. 回答为“ 9000”的第一个小程序的AID(成功响应的状态,这里是所有可能的响应的列表)记录在NFCISO7816Tag类型对象initialSelectedAID字段中,该字段放入检测到的芯片数组中


@available(iOS 13.0, *)

public protocol NFCISO7816Tag : NFCNDEFTag, __NFCTag {

   /**

    * @property initialSelectedAID The Hex string of the application identifier (DF name) selected by the reader when the tag is discovered.

    *                              This will match one of the entries in the «com.apple.developer.nfc.readersession.iso7816.select-identifiers»

    *                              in the Info.plist.

    */

   @available(iOS 13.0, *)

   var initialSelectedAID: String { get }


此外,您可以从数组中选择任何此类对象,然后使用sendCommand方法APDU命令发送所选的applet。



现在让我们讨论这个限制:

 

Core NFC doesn't support payment-related Application IDs.


也就是说,Core NFC不支持支付AID,即与支付终端配合使用的实战AID。



当然,您可以在info.plist列表中添加一个付款AID,但是Core NFC会忽略它,并且不会为其发送SELECT(顺便说一下,这是所有使用过的AID的列表)。苹果公司就是通过这种方式保护其Apple Pay技术,从而阻止第三方开发人员访问任何iPhone的支付功能(以及与此相关的所有功能)。



解决方法



首先想到的是,是否可以在info.plist中添加支付小程序的AID,而不是AID卡管理器(卡管理器是芯片操作系统中用于管理卡的一组服务,这些服务负责管理和安全性),以便然后手动向他发送带有所需小程序的AID的SELECT命令?



在这里,我们偶然发现了第一个陷阱-核心NFC不允许发送包含未在info.plist中注册的AID的SELECT命令



好的,我们添加了A0000000041010,但这也是一个失败-核心NFC不允许发送包含付款AID的SELECT命令,无论它是否在info.plist中



让我们看看ID限制的工作原理。



在info.plist中,我们指定了以下AID:



1. A000000001510000                        	- GlobalPlatform Card Manager AID
2. 325041592E5359532E444446303101      - Proximity Payment System Environment (PPSE) 
3. A0000000041010                             	- Mastercard Credit/Debit (Global)
4. A00000000401                                 	- Mastercard PayPass
5. A00000000410101213                    	- Mastercard Credit
6. A00000000410101215                    	- Mastercard Credit
7. A00000000410101214                    	-   AID                 
8. A00000000410101216                    	-   AID 
9. A0000000041010121F                    	-   AID 
10. A0000000041010BB5445535401 	        -   Long AID
11. A0000000041010BB5445535405 	        -   Long AID
12. A000000004101FBB5445535401 	        -    AID                
13. A000000004101F1213                    	-    AID                 
14. A00000000F1010                             	-    AID
15. A0000000040F                                     -    AID


我们安装了14个具有不同AID的支付小程序(项目2-11-支付AID),并尝试将每个这些AID发送给Card Manager SELECT命令。



民数记12-15回答。  



事实证明,该限制是对某个AID前缀强加的,该前缀的存在确定其是否为付款标识符。



很遗憾,但是此方法不再有效。GlobalPlatform



提供的第二个个性化选项是INSTALL [for personalization]命令。





它被发送到卡管理器,并包含需要个性化的applet的AID。



然后,您可以将STORE DATA命令发送到Card Manager,然后将其转发到目标应用程序。



但是有一个限制。为了使applet支持这种个性化,它必须实现org.globalplatform.Application接口



卡管理器,对带有NXP分配给M / Chip Advance小程序的万事达信用卡/借记卡(全局)AID的INSTALL [(用于个性化)命令响应为错误“ 6985”(使用条件未得到满足), 这意味着您需要检查它是否实现是否为Application接口







为此,我们编写了一个实现该接口的简单虚拟应用程序。不出所料,它在INSTALL上回答“ 9000”(用于个性化设置)。



但是,当应用程序是由应用程序实现的接口删除,它开始向此命令“6985”反应,如与M /芯片推进小程序的情况。



因此,问题恰恰是NXP应用程序没有实现这种类型的个性化所需的接口。此方法也消失了。



其他任务



  1. 获取芯片的UID

    这可以通过非常简单的方式来完成。

    NFC会话开始时,模块会查找芯片,其applet的AID已在info.plist中注册,并将其添加到阵列中。

    之后,您可以从那里获取任何一个,如果其类型为NFCISO7816Tag,则它具有一个标识符字段,其中包含芯片的UID。



    /**
      * @discussion The hardware UID of the tag.
    */
    var identifier: Data { get }


  2. 获取ATR芯片

    但是Core NFC似乎无法接收ATR因为在框架中没有用于此的单独工具,您无法使用APDU命令获得ATR


结论



底线是什么?



  1. ISO/IEC 7816 ( UID), Core NFC;
  2. , Apple ;
  3. , , iPhone, , Application — ;
  4. , AID — .


回答开始时提出的问题,我们能否让电子钱包用户有机会通过将其银行卡连接到iPhone来将其银行卡加载到密钥卡中?



作为任务的一部分,我们决定使用外部BLE读取器将iPhone的银行卡令牌加载到无源可穿戴设备中。



希望苹果将来能够扩展NFC Core的功能,以实现此功能以及第三方应用程序中的一系列其他令牌化和支付任务。但是,最近的消息表明这不太可能在不久的将来发生。



研究的副作用



在工作过程中,诞生了一个潜在的欺诈方案,该欺诈方案无法使用Apple智能手机复制,但是很有可能通过具有NFC支持和主机卡仿真技术的Android智能手机来实施。



底线是: 



  • 第一个智能手机将用作终端,即它将连接到银行卡并与其支付小程序进行交互,
  • 第二部智能手机-作为一种付款方式(在结帐时,看起来就像使用智能手机进行常规付款一样)。


使用此方案,您可以创建一个连锁银行卡-智能手机-智能手机-付款终端,即:



  1. 第一个智能手机附在任何银行卡上;
  2. 第二个应用于支付终端;
  3. 第二智能手机通过向第一智能手机发送终端发送的APDU命令来模拟银行卡
  4. 第一智能手机将这些命令发送到所附的银行卡,将其响应发送到第二智能手机;
  5. 第二智能手机将接收到的响应发送给终端;
  6. 付款已经完成。


也就是说,潜在的欺诈者可以将智能手机放到您的口袋中并为购买付款。小心!



为了避免成为这种欺诈性计划的受害者,您可以例如将银行卡转移到智能手机上,而不用随身携带塑料。



而不是结论



我试图用一种简单的语言写这篇文章,而不是深入研究主题领域的术语。在其中,我描述了我们正在从事的创新项目之一,主题领域以及对iOS Core NFC框架新功能的一些研究。



欢迎任何反馈:问题,评论,评论,补充,建设性批评。



有用的链接



如果您对本文中描述的主题感兴趣,那么下面是几个链接,可以进行更详细的研究:



  1. I. M. Goldovsky的书“银行微处理器卡

  2. 概念EMV付款代币化

  3. 分析物联网市场的文章: 




All Articles