【Java开源代码栏目提醒】:本文主要为网学会员提供“面向 PCI 安全标准的 JavaPOS 应用方案设计 - 培训资料”,希望对需要面向 PCI 安全标准的 JavaPOS 应用方案设计 - 培训资料网友有所帮助,学习一下!
福建电脑福建电脑2008年第11期福建电脑面向PCI安全标准的JavaPOS应用方案设计郭栋(福建新大陆电脑股份有限公司产品技术研究院福建福州350015)【摘要】:电子支付的外卡业务和IC卡脱机交易对金融POS的系统安全提出了更高的要求,这已经成为其应用推广的瓶颈。
本文分析了PCI标准对POS安全的软件需求。
提出了基于J2ME的JavaPOS应用方案,实现类属性安全、类编译安全、类控件安全以及应用下载安全控制的设计。
PCI测试案例表明该方案符合PCI安全需求。
【关键词】:PCI、J2ME、金融POS、安全1、问题的提出POS(PointOfSale)即销售点终端。
金融POS是专门用于支持金融电子交易的多功能终端设备,一般安装在银行卡的特约商户和受理网点,能实现电子资金转帐功能,通常支持消费、预授权、
查询、转帐等功能,具有方便快捷、安全可靠等特点。
由于金融POS涉及到客户和银行的资金安全,因此设备的安全性是衡量金融POS的最关键指标。
PCI(PaymentCardIndustry)123是信用卡行业(也称支付卡行业)相关的一项符合性标准,由Visa、MasterCard和JCB三大国际组织制定并实施。
POS-PED针对所有的PIN接收设备。
凡是需要在设备上直接输入PIN的POS,必须要通过POS-PED的安全认证。
传统POS在设备安全性方面做了大量工作,对于设备的物理安全、逻辑安全、生产运输等采用了许多成熟的设计方案,但这些并不能保证都能符合PCIPOS-PED的安全要求。
其中应用开发接口(API:ApplicationProgramInterface)就是一项软肋。
POS的应用程序开发采用编译性的C语言,应用对各种外设及数据存储的访问通过API来实现。
由于设备及存储可以被任意能调用API的应用程序所操作,因此在敏感设备、敏感数据、关键存储的安全权限管理等方面具有很大的局限性。
如果开放基本设备存储操作,则难以阻挡非法程序的攻击;屏蔽这些底层功能,又给应用开发增加复杂程度。
特别是恶意程序的指针窥探、缓冲区溢出等攻击破坏手段,将直接危害到整个系统的安全。
本文旨在阐述一种在原有金融POS整体安全性的基础上,以
Java为核心语言以
Java控件类为基本结构的POS应用开发方案。
相对于传统的API应用开发方式,新方案有效地弥补了传统API面向PCI安全标准时的缺陷,在NL8320金融POS上成功试用并通过了PCI应用案例的测试。
2、PCI标准对金融POS设备软件的安全要求PCI对涉及PIN接收的POS设备的安全标准POS-PEDSR(PaymentCardIndustryPOSPINEntryDeviceSecurityRequire-ments)自2004年发布1.0版以来23,一直在升级变化中。
2007年4月发布的2.0版是目前最新的POS-PED标准。
PCIPOS-PEDSRv2.0的主要内容有:A.物理要求B.逻辑安全机制C.在线要求D.离线需求E.设备生产安全需求F.设备管理要使传统API接口符合PCI的安全标准,一方面必须对API接口进行全面的重新设计,堵塞各种可能的漏洞;另一方面还需升级软件系统的防护架构,防止恶意或错误程序对系统的破坏、窥视、探测和修改。
这样的改造
工作几乎是对原API结构的完全再造,其代价不啻于重新设计一套新的应用开发方案。
在这样的背景下,可以考虑彻底摆脱API架构的思想束缚,选用其它的语言、思路、架构、
方案来重新设计应用程序的开发方式。
以
Java为基本语言,构造一套面向对象、安全可靠、简单易用、功能强大的JavaPOS应用程序开发系统的设计方案具有很强的现实可行性。
3、
Java的安全性
Java是由SUN公司推出的新一代面向对象的程序设计语言,是一种与平台无关、分布式、解释性、健壮安全、结构中立、可移植性强的多线程动态语言。
Java的安全性首先来自于其语言的解释性。
由于
Java依赖虚拟机解释执行,从而有效隔离了上层应用程序和底层操作系统,避免了应用程序对敏感设备和数据存储的非法访问或错误溢出。
其次,
Java在语法设计上摒弃了容易引发程序错误和恶意攻击的指针类型及内存管理。
另外在
Java虚拟机层面,通过严格的
代码校验和类型检查,可以有效地阻隔非法或错误的程序对系统的破坏,具有很高的健壮性。
因此,
Java虽然源于C,但它消除了许多C不可靠因素,可以防止许多编程错误。
对于POS应用开发而言,
Java语言在应用开发方面具有先天的安全优势。
首先,
Java是强类型的语言,要求显式的方法声明,这保证了编译器可以发现方法调用错误,保证程序更加可靠;其次,
Java不支持指针,这杜绝了内存的非法访问;第三,
Java的自动单元收集防止了内存丢失等动态内存分配导致的问题;第四,
Java解释器运行时实施检查,可以发现数组和字符串访问的越界,最后,
Java提供了异常处理机制,程序员可以把一组错误
代码放在一个地方,这样可以简化错误处理任务便于恢复。
综上所述,如果在POS应用开发中采用
Java语言,将给POS的整体安全性带来极大的提高。
面向PCI严格的安全检验标准,原来基于C语言的API模式无法根治或需付出很大代价的
问题,但随着
Java的应用则变得相当简单。
4、JavaPOS的应用安全策略作为面向PCI安全标准的应用开发方案,安全性必须在应用开发的各个层面体现。
在立足于
Java语言的基础上,应用开发方案需要重点施展以下几项应用安全策略:1)类属性的安全
设计Java虚拟机的解释执行特性只是隔离了应用程序
代码和底层固件
代码,POS功能简表提供的基础类还需运用一定的访问权限控制技术。
如果应用程序能无限制地通过简表中的基础类遥控底层固件,KVM的
代码隔离就变得毫无意义了。
Java的语法中对于
Java类、类属变量、类方法均有访问权限类型修饰符。
访问类型修饰符共有四种,分别为:aPublic――开放类型,其修饰的类、类属变量及方法,包内及包外的任何类均可以访问bProtected――保护类型,其修饰的类、类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问cPrivate――私有类型,其修饰的类、类属变量及方法,包内包外的任何类均不能访问dFriendly――友善类型,其修饰的类、类属变量及方法,包内的任何类都可以访问它,而包外的任何类都不能访问它,包括包外继承了此类的子类126福建电脑2008年第11期福建电脑另外,还有final、static等属性可以综合利用,配合上述修饰符共同实现有效的访问权限控制。
充分利用
Java语法的访问类型修饰符,可以有针对性地保护和屏蔽基础类中不适宜向外界开放的功能,提升了基础类库的安全性。
在基础类库的设计中,首先要保证基础类包和应用程序类包的充分隔离。
然后在此基础上,通过设定不同的访问权限修饰符,规范各个基础类的开放性。
例如某基础类用于操作某关键设备,一般将该类设定为friendly属性。
该属性允许在其之上派生高一层的基础类,同时又禁止应用程序继承该基础类。
该类的内属变量通常设为protected,既实现了类自身的封装性,又不影响继承类的操作。
对于面向应用程序开放的基础类,可将其属性设定为publicfinal,既不影响应用程序的对该类的使用,又能避免应用程序对该类恶意继承造成内部数据的泄露和破坏。
2)类编译的安全设计
Java本质上是一种解释性语言,虽然源程序会编译成二进制的字节码,但由于反编译极其容易,.class文件实质上和.
java一样透明。
在实现POS应用简表的基础类后,至少需要向应用开发人员提供.class类文件以支持其应用程序的编译。
但考虑到这些基础类的.class可以轻易地被转换为.
java源码,向应用开发人员提供编译环境反而产生了泄密的嫌疑。
针对此问题,一方面可以通过应用下载的管理,不允许应用程序入侵基础类包空间,从而避免应用程序非法篡改、覆盖、引用、继承基础类。
另一方面,还是需要尽量减少基础类的信息泄露,避免恶意的推测和攻击。
为此,J2ME的类编译特性需要被充分利用起来。
J2ME的应用程序由javac程序编译,并经由preverify程序进行预处理。
在此过程中,基础类的.class文件是必须提供的,否则编译器无法解析应用程序对基础类的引用且preverify也无法判断该引用是否合法。
但经过实践分析,javac和preverify对类引用的检查只关注引用名称的存在与否和类型是否匹配,而并不关注该引用的实际内容。
基于此原理,解决.class信息泄露的方案可以如下实现。
首先,完整的基础类库仅用于POS设备的下载,依靠下载安全
管理系统来保证其不被外界窥探和读取。
其次,将基础类源码中的所有实际
代码删除,仅保留最少的类方法名称,然后编译成面向应用开发人员的编译专用基础类库。
这套类库即使反编译,除了能看到允许公开的public方法以外,实质性的
代码一概没有。
而用这套类库编译编译后的应用程序,下载到POS设备后,依然可以正确地引用完整的基础类库,实现真实的
程序效果。
3)类控件的安全设计PCI安全的核心,在于个人密码(PIN)和访问控制。
如何保证PIN的安全,是通过PCI认证的最大难题。
对于手持式POS而言,PIN就在POS的键盘上直接输入。
这里自然就产生了一个矛盾:应用程序肯定需要能读取POS键盘的输入,数字键用于表示金额,功能键用于切换菜单等等;但同时应用程序又绝对不能读取到PIN输入的数字键,即PIN的明文。
解决上述矛盾的
常用方法有:键盘使用受控、键盘数据加密、多层权限管理等,但在实际使用中不是应用复杂度太大就是安全性多少有漏洞。
分析PIN安全输入的核心,实质上是要求PIN的键盘输入和加密PINBlock的输出过程实现原子化,形成不可分割的过程封装,从而避免PIN明文的泄露。
控件就是实现过程封装原子化的重要手段。
专门编制的PIN输入控件,内部封装了一系列PIN输入输出过程。
当用户进入输入PIN状态时,会触发明显且独特的状态提示(如屏幕边框闪烁、特殊蜂鸣器声响、滚动的PIN输入提示信息等);用户输入的键码,由控件内部存储和转换;用户输入完毕,应用程序只能通过约定的共用接口从PIN控件中获取加密后的PINBlock数据。
PIN控件内部实现了状态提示、键盘输入、PIN加密、PINBlock输出、敏感数据清除等一系列逻辑过程,而这些内部过程依靠
Java访问权限修饰的私有属性设置,阻止了应用程序对控件内部的窥探和修改。
为了提高整体效率,可以考虑将上述控件的逻辑过程直接置于底层固件中实现,而
Java控件仅需对固件接口进行简单的调用。
如此设计不仅能提高系统的整体运行速度,而且由于
Java控件中不需包含核心过程和加密算法
代码,不需存储敏感数据明文,安全性得以大幅提高。
即使控件的.class文件遭遇窃取和破译,也不至于导致系统安全方面的损害和知识产权方面的泄密。
通过将用户输入输出涉及的功能、过程等全面控件化,有效地解决了敏感数据(PIN)输入的安全性和非敏感数据输入的便利性两者之间的矛盾。
PIN控件专门用于PIN输入过程,具有特殊的安全提示信息,输入显示为号,输出只有PINBlock密文;普通Edit控件用于一般的字符输入,输入直接显示明文,输出也是明文信息;一般Pass
word控件用于输入非关键性口令等,输入显示为号,但安全提示信息明确指明其与PIN控件的区别,以确保用户不会错误输入PIN。
应用程序只能通过上述控件接受用户的输入,无法通过其他途径伪造出PIN输入画面和效果从而套取用户PIN。
4)应用下载的安全管理安全的
Java基础类库,如果没有程序发布、安装、校验、授权等一系列外部机制的配合,一样会被攻击者轻易地篡改或绕过。
配合JavaPOS应用方案,必须要有一套完善的应用程序发布机制来支撑。
具体到POS设备上,其实质就是
Java程序的下载安全管理机制。
下载到POS设备的
Java程序分为两种,一种是基础类包,一种是应用程序类包。
如前所述,基础类包涉及到关键设备、敏感数据、核心流程等与设备安全密切相关的部分,因此其安全类别应当等同于底层固件。
应用程序类包只包含应用功能和流程,对敏感数据和关键设备的操作依靠基础类的控件,因此其安全级别属于应用级。
因此,设计下载安全管理机制,其核心在于如何严格区分这两种不同的下载级别。
在实践中,可以采取如给不同下载级别分配不同的下载控制密钥、规定不同级别必须存储在不同的区域、不同级别的下载数据使用不同的签名和校验算法等,将两者严格的加以区分对待。
基础类包,在安全层面与底层固件处于同一水平。
基础类包的开发、维护、升级、发布必须由拥有底层固件控制权限的人员实施,提交的版本必须加密并用固件私钥签名。
执行基础类包安装下载前必须获得固件下载授权许可,实践中可采用口令、IC卡、U盾等方法和工具进行授权控制。
下载到POS内部的基础类包必须经过严格的校验过程,通过检查数字签名来核实软件版本的真实有效性。
只有通过层层审核的基础类包,才会最终被安装到正确的存储区域中,以供应用程序的继承和调用。
应用程序类包,其安全级别属于应用级。
凡是被授权允许进行应用开发和下载的,都可以开发自己的应用并装载进POS。
应用程序下载进POS设备时,首先必须核对其被授权内容和项目,应用程序的名称、功能、存储区域、入口参数等必须与授权书相匹配。
应用程序同样需要加密和签名,但密钥均由授权书所规定,不同的应用必须使用不同的密钥组。
5、PCI案例测试和结论基于J2ME的JavaPOS应用方案经过长期的试验和论证,已经成功地在Newland公司的NL8320金融POS上应用成功。
采用JavaPOS应用方案开发的PCIPOS-PED送检程序,经受了严格的安全测试。
安全测试的项目参照PCIPOS-PEDSRv2.0的条目,测试用例主要参考DTRS中的测试准则和中国银联对安全POS的测试案例,采用DTRS的布局风格编写。
PCI测试首先从审核PCI_POS_Eval_Vendor_Questionnaire(问卷调查表)和PCI_POS_Security_Requirements(PCI勾叉表)以及设计
文档开始,共规划了安全自检测试、逻辑异常测试、检查固件升级认证管理、固件的远程升级测试、PIN输入期间显示测试、清除内部缓冲区测试、敏感服务的保护测试、敏感服务的(下转第157页)127福建电脑2008年第11期福建电脑11111111111111111111111111111111111111111111111(上接第127页)限制测试、随机数测试、PIN穷举探测测试、密钥管理测试、加密算法测试、密钥专用性测试、密钥明文的安全性测试、交易控制测试、密钥替换测试、消息鉴别功能测试等共计17种项目62条测试案例。
NL8320顺利地通过了上述全部测试项目。
具体测试内容和结论参见NL8320软件测试
报告(适用于PCI2.0认证)。
纵观NL8320的测试表现,JavaPOS应用方案是其成功的关键。
由于JavaPOS从一开始便摆脱了传统基于C语言的API架构的束缚,引入
Java作为开发语言,为后期的安全设计带来整体性的提升。
同时,JavaPOS的应用方案设计充分考虑到PCIPOS-PED安全标准的各项要求,综合运用了
Java语言、
Java编译器、
Java类特性、
Java控件、下载管理器等各种手段方法,成功地构造了一个面向PCIPOS-PED安全标准的金融POS应用
软件开发平台。
参考文献:1.刘岩.PCI标准及其应用现状的分析J.信息安全与
通信保密,2008,12:38-402.VISA.PaymentCardIndustryPCI:POSPINEntryDeviceEvaluationVendorQuestionnaire.Version1.3.2005.3.VISA.PaymentCardIndustryPCI:POSPINEntryDeviceSecurityRequirementsManual.Version1.3A.20064.秦娟,杨文利,陈镘巨,郝庭柱,孙小薇,董吉虹.J2ME移植到嵌入式
系统研究J.天津理工大学学报.2006,226:35-385.廖永刚,余东梅,张秋余.J2ME架构与安全机制的研究J.计算机工程与设计,2006,274:575-5776.吴敏,刘萍.基于J2ME和J2EE的手机银行设计与实现J.微计算机信息(嵌入式与SOC),2006,227-2:294-2967.吴庆,陆明泉,冯振明.基于J2ME的嵌入式系统的开发J.
计算机应用与软件,2005,222:35-368.美JamesKeogh.J2ME开发大全M.潘颖,王磊译.北京:清华大学出版社,2004.9.Lindholm,YellinTF.JavavirtualmachinespecificationEB/OL.Sec-ondEdition.Addison-Wesley:ftp://ftp.javasoft.com/docs/spec/vmspec.2nded.html.zip10.SunMicrosystemsInc.JSR-000139ConnectedLimitedDeviceCon-figuration1.1EB/OL.http://jcp.org/aboutJava/communityprocess/final/jsr139/index.html库服务器的作用。
对数据存储中数据的读写操作应该通过适当的ContentProvider传递,而不是直接访问文件或数据库。
4.Android的开发环境配置Android的应用开发通常使用Google提供的AndroidSDK中的工具集,包括编译器、资源编译器、调试器和模拟器,并使用Eclipse加上AndroidDeveloperTools插件作为集成开发环境。
要通过AndroidSDK中提供的
代码和工具进行Android应用程序的开发,需要一个合适的用于开发的计算机和合适的开发环境。
作为
开源的手机平台,AndroidSDK不仅可以支持微软的XP和Vista系统,也可以支持Linux操作系统(UbuntuLinux)和MacOS10.4以上版本。
Android的主要开发工具是Eclipse(必须是3.2或3.3),加上Android在Eclipse中的开发工具插件(ADT)。
该插件是一个专门为Android定制的插件,该插件集成了对Android工程和工具的支持,它包含了大量功能强大的扩展,使得创建、运行、调试Android程序更加简单便捷。
开发环境建立如下:首先,必须从Google下载AndroidSDK,并将其解压至合适的地方,将目录../tools加入系统环境变量中。
其次,下载Eclipse并安装Eclipse插件,先启运Eclipse,选择帮助-软件升级-寻找并安装,然后在弹出的窗口中,选择寻找新的功能安装,再点下一步,再点击新的远程站点,输入站点名,并进入下一步安装ADT。
这样,开发环境就配置完成。
有了基本的系统支持和开发工具,就可以在此基础上开发自己的Android应用程序。
5.Android应用开发实例在完成了开发环境的配置后,要开发运行于Android的程序是非常方便的。
通常开发一个Android程序的流程如下:创建项目;通过XMLLayout更新用户界面;运行程序;调试程序。
这些都可以在EclipseADT的界面中完成。
我们以一个简单的音频播放器为例说明一下开发过程。
程序的主要功能是播放本地上指定的音频文件,使用
Java开发。
首先通过Eclipse的FileNewProject菜单创建AndroidProject项目。
然后在新Android项目对话框中添加项目的详细信息。
完成后向导会自动替我们生成程序的框架,在此基础上我们可以通过修改自动生成
代码模板来实现自己的功能。
Android内置支持多种多媒体文件播放。
程序中先定义一个MediaPlayer对象mp,然后通过调用MediaPlayer的SetData-Soucepath方法提取本地上的音频文件,path为音频文件的绝对路径,然后通过setAudioStreamAudioSystem.STREAM_MUSIC方法设置流媒体类型,完成准备工作。
同时通过
xml对界面进行设计,在其中放置几个按钮分别代表play,pause,stop,reset,
代码如下所示:图1为程序界面。
在此基础上分别对这些按钮进行事件监听,通过调用mp.prepare和mp.start开始播放;分别调用mp.pause、mp.stop和mp.reset进行歌曲的暂停,停止和重置。
6.展望通讯移动的发展,带动了手机的发展,而手机的发展,带动了手机软件的发展,手机软件的发展,最终形成了手机操作系统的诞生。
Android的诞生不仅具有它固有的时代背景,更带来了新的手机操作系统的革命。
Android不仅是一种操作系统,它更是一个
开源的平台,Google集合34家包括高通,摩托罗拉,三星,HTC等来自诸多领域的领先技术和无线公司组成开放手机联盟OHA,共同努力开发Android平台。
在国内,中国移动已经加入OHA,并有机会成为第一家在中国运营Android手机的公司。
中国的许多软件公司已经将目光投向了Android。
首款基于Android平台的智能手机有望在2008年下半年推出。
在目前,由于Android平台刚发布半年,系统还有许多需要充实的地方;但相信在未来几年中,GoogleAndroid将对移动产业带来较大的影响,Android会变得更加的强壮和易用。
参考文献:1.田淼.用Android开发手机应用.程序员,2008,(1):25-27.2.Google.AndroidSDKDocumentation.http://code.google.com/android/documentation.html图1简单的Android音乐播放器157