简介:近地场通讯(Near FieldCommunication,NFC)协议已被Android系统部分支持。随着Android手机的迅速普及,作为NFC三种工作模式之一的CardEmulation模式在电子考勤、移动支付等领域具有越来越广泛的应用潜力。尽管在Android4.4版本之前公开的API并不支持CardEmulation模式,但由于Android本身的开源特征,借助开源项目SEEK或Android隐藏的API,仍可探索CardEmulation模式在Android系统上的应用。从NFC的特征和An-droid系统上NFC技术的实现出发,说明了CardEmulation模式的特点和应用场景,研究了Android系统上Card Em-ulation模式的现状和应用模式,分析了CardEmulation模式应用中的问题。
近地场通信(Near Field Communication,NFC)是一种为移动电子设备在近距离范围内提供互联与信息交换能力的无线技术。作为一种新的短距无线通信技术,NFC可在多种电子设备之间提供直观、简单而又安全的通信。NFC技术最初由诺基亚和飞利浦公司联合提出, 旨在减少电子设备间通信的复杂性,简化数据交换过程,降低通信成本。索尼公司随之加入,三方成立了NFC论坛以推动NFC技术的发展和NFC生态系统的形成。NFC论坛先后制定了一系列协议和标准,鼓励论坛成员基于N FC标准规范开发和制造相关产品。如今NFC论坛成员多达百个,不仅包括传统的电子设备制造商、网络运营商,而且金融机构与电子支付机构等也加入进来。我国的中国移动公司和中国银联公司也是该论坛成员。完整的N FC生态已初步形成。NFC技术与其它无线通信技术如WiFi 、蓝牙等有很大区别。一是NFC的理论最大有效通信范围为10cm,典型范围在1~4cm。通信双方必须在很近范围内才有可能建立连接并通信,这就保证了通信发生在相对安全的环境。而蓝牙、W iFi的通信覆盖范围显然比NFC大得多,范围的扩大会出现许多不安全因素。二是NFC的传输速率最大只有414kbps,远远低于其它两种技术,因而适用于交换一些重要数据。三是NFC的启动速度最多只有 0.1秒, 从人的感觉来说是瞬间建立连接,这一点明显优于WiFi和蓝牙。A ndroid系统作为当前流行的移动平台操作系统致力于为用户提供良好的体验。在公开的API方面,An-droid系统从2.3.2版本开始加入对NFC技术的支持, 但此版本的NFC功能十分有限,仅支持手机作为读入器读取标签中的数据。Android 2.3.3版本开始支持对标签进行写入数据和有限的点对点通信,然而此时的点对点通信仅限于NDEF(NFC Data Exchang e Format)格式的数据推送。Android 4.0版本开始支持完整的Reader-Writer模式和Peer-To-Peer模式。由于安全、硬件等多方面因素,支持Card Emulation模式的API被Android隐藏了,很多人误认为Card Emulation模式并不被Android支持。Android 4.4版本开始公开支持Host-based Card Emula- tion。NFC规范定义了三种工作模式,分别是Reader-Writ- er Mode(读写模式),Peer-To-Peer Mode(点对点模式)和Card Emulation Mode(卡模拟模式)。从Android手机角度,Reader-Writer模式是指手机作为读取器读取智能卡或标签中的数据,以及作为写入器将数据写入智能卡或标签。读取或写入的内容可以是文字、URI或电子海报等。Peer-To- Peer模式是指在手机间使用NFC技术建立双向点对点连接以交换数据,例如在手机间交换电子名片、复制联系人电话等。Card Emulation模式是指手机模拟成一个被动式卡被NFC读取器(NFC Reader)读取数据。根据NFC规范,Card Emulation模式的应用领域一般涉及个人隐私和财务信息场景,安全问题是其不能回避的。本文从NFC的特征和Android上NFC技术的实现出发,在对Card Emulation模式现状与应用进行研究的基础上,分析Card Emulation模式应用中的问题,对其在Android系统中的应用具有重要参考意义。
1.Cardemulation mode
Cardemulation mode用于模拟人们生活中使用到的各种卡,如金融卡、交通卡和门卡等。在该模式下,卡的数据被放到NFC手机上,NFC手机模拟卡替代了原先实体卡的功能,使人们摆脱需要带各种卡的烦恼,为生活增添了许多便利。
Card Emulation模式的一般情形是当手机靠近NFCReader时被模拟成被动式卡,NFC Reader便可读取手机模拟卡里的相关数据。NFC规范没有规定手机模拟标签或智能卡的数量,即手机可模拟并保存多种标签或智能卡。另外,NFC Reader并不对标签或智能卡进行手机模拟与现实的区分。
Card Emulation模式与其它两种模式在许多地方相似,必须加以区分。应用中,经常会将Peer-To-Peer模式误当成Card Emulation模式,即误将Peer-To-Peer模式其中一方当成Card Emulation的NFC Reader。在Card Emulation模式中,作为NFC
Reader一方不能为手机,否则此时Android手机的工作模式是Peer-To-Peer模式。
在Reader-Writer模式中,手机与NFC标签的通信是双向的,既可以写入数据到NFC标签,也可以从已存在的数据标签中读取信息。在Peer-To-Peer模式中,数据传输也是双向的。而Card Emulation模式中的数据传输则是单向的,NFC Reader从已经模拟成卡的手机中读取信息。 另外,认为当手机锁屏后NFC功能不再有效是片面的。锁屏的NFC手机,不能起作用的是Peer-To-Peer模式和Reader-Writer模式,而不包括Card Emulation模式。因为此时双向通信的一方已经失效。根据NFC协议, Card Emulation模式的数据通信是单向的,此时Card Em-u lation模式仍可有效,除非手机设置NFC功能关闭。2 安全模块 Card Emulation模式的应用场景决定了必须考虑安全控制。当前NFC领域对安全控制的实现分为两类: 基于软件的主机卡模式(Host Card Mode)和基于硬件的虚拟卡模式(Virtual Card Mode)。基于软件的主机卡模式需要专门的Android固件(最新的Andriod 4.4kitkat版本已加入对该模式支持[ 7] ),而且不比基于硬件的类型安全。本文仅讨论基于硬件的虚拟卡模式。
虚拟卡的硬件主要是指安全模块(Security Ele-m ent)。它是存储应用、密钥及敏感数据的载体。可选的安全模块方案分为多种,有手机硬件模块本身集成方案、基于手机SIM卡方案、基于手机SD卡(又称安全SD卡)和基于标签(Stick)方案等。每种安全模块方案各有优缺点,每种方案都事关NFC生态系统的各方利益。通常方案的选择跟TSM授信服务管理器(Trusted Service Man-ag er)的技术方案有关,此处不再详细叙述。3 手机访问安全模块 Android系统本身并未实现JSR-177或Op en MobileAPI规范, 这就造成了在手机应用中访问安全模块的难题。不过由于Android系统的开源特征,通过探索An-droid系统隐藏的NFC API还是可以做到的。Android源码中的NfcExecutionEnviroment类就是这样一个类,它提供了一个与安全模块通信的简单接口。开发时除必须设置一些NFC权限配置外,还要引入一个可选库com.an-droid.nfc_extras到SDK上并通过反射机制获取该库Nf-cAdap terExtras类的一个实例。借助该实例可进行打开S E、发送命令、关闭SE等操作[8] 。以上方法的缺点是只支持在基于SIM卡和手机硬件 本身集成的安全模块上实现。另外由于API是隐藏的,没有公开,有Android官方在未来版本中对这部分API进行更改和删除的风险。
另一个方法是借助于开源项目seek-for-android,该项目又叫SmartCard API。由于存在多种SE方案,该项目通过屏蔽对不同方案的访问细节,以SIMalliance Open-Mobile API为参考为开发者提供了统一的访问接口。
SmartCard API结构如图1所示。左边是Android系统的NFC协议实现,包括NFC API、程序库和NFC硬件,其中CLF(Contactless Frontend)一般指NFC
RF模块和NFC天线。右边是该项目对每种SE的访问实现。四个terminal分别是手机内置安全模块(eSE)、手机卡(SIM)、安全SD卡(ASSD)和外置模块安全模块(plugin)。
当前该项目大部分功能模块已被实现,可将该工程的jar包引入到开发应用中
4 应用架构设计
应用架构设计应遵循Android系统的设计要求。由于基于Card Emulation模式的应用关系到用户切身利益,对应用架构进行设计时除了要完成业务功能的要求外,还应着重考虑对安全问题的支持。
设计中应从以下三个方面对安全因素予以考虑:安全模块中的应用设计和实现、应用访问安全模块的部分设计和实现和NFC Reader与安全模块进行交互的部分设计与实现。
安全模块的应用设计通过编写运行在安全模块中的程序(以下称SE程序)实现。SE程序可由Java语言编写的Applets实现,然后将Applet安装到安全模块中。一个Applet是一个以二进制代码形式运行在Java上的程序。Java Card为SE程序运行提供安全的运行环境,同时多个SE程序可以安装到同一个Java Card上,即安全模块是一个可运行多个Applet的Java Card。开发者根据JavaCard规范编写Applet。安装Applet时,必须提供访问SE的密钥,应用开发者可向TSM平台商申请。TSM平台商一般指安全模块方案实施方(如SIM卡方案网络运营商)
。NFC Reader部分实现了通过Android手机NFC In-terface与安全模块进行通信。NFC Reader的编程比较复杂,不同的NFC Reader有不同的提供商,且提供不同的编程方案,须根据NFC Reader提供商的要求编写。该部分需要处理好与手机中安全模块的通信问题,用于提供建立连接、读取信息、确认用户业务操作等内容。NFCReader程序一般由TSM平台商统一完成,应用开发者只需遵守开发协议即可。
Android手机应用用于实现具体业务,即Card Emu-lation模式中卡的部分,一般应提供卡的初始化和改动、密码控制、状态控制等管理功能。同时,需提供交易管理、交易历史保存等功能。实现这些功能均需在应用中访问安全模块程序,以获得SE中存储的相关信息并对用户操作进行确认。因此,需要提供一个用户界面接口为用户与安全模块交互提供支持。访问安全模块部分可以参见前文所述的通过隐藏API或Smartcard API项目的方法实现。在应用中与SE程序进行通信需借助ApplicationProtocal Data Units(APDUs)。APDU分为CommandAPDU和Response APDU两种类型,前一种发送指令到安全模块,后一种由安全模块发回返回信息。
5 Card Emulation模式问题
Card Emulation模式未被Android公开支持的一个原因来自它的安全模块。有多种SE方案可供选择的现状导致NFC三方———手机制造商、移动运营商与金融机构均可以掌握用户Android NFC手机中安全模块的主密钥,各方利益互不相让。各方职能没有完全厘清导致基于Card Emulation的生态很难形成,第三方应用开发商根本没有获取访问安全模块的途径,安装它们开发的Applet到用户手机的安全模块中变得更加困难。Card Emulation模式模拟的还是现实中的“卡”,而现实中采用非接触式通信接口的数据卡有多种标准,实际安装在智能手机上时,必须从这些标准中选择一个。一般情况下,存储加密信息的“安全模块”存储容量较小。由于在Android NFC手机上
6 结语
当前无论在Android平台还是其它平台上,都未能出现一个成熟并被广泛使用的基于Card Emulation模式的应用,即使是Google的Android应用Wallet也没有达到理想要求,Card Emulation模式还有待进一步探索。最近发布的Android 4.4kitkat版本开始支持安全的NFC传输协议,Host-based Card Emulation也为这一模式的发展提供了更多选择。相信随着Android版本对NFC支持的日趋完整以及NFC生态的不断完善,基于Card Emula-tion的应用终究会为人们的生活带来更多便利安装基于Card Emula-tion模式应用的数量没有限制,开发人员之间会相互争夺空间。另外,当安全元件出现物理性损坏时,无法恢复数据。