http://blog.sina.com.cn/s/blog_64cc82620100rcgu.html
最近在做一个基于PBOC电子现金卡的终端应用, 项目还没有完成, 但电子现金部分的处理模块已完成,剩下的基本是UI和调试的事情了. 想把对PBOC电子现金理解整理成一篇文章.
电子现金的概念是在PBOC规范的第十三部分<<基于借记/贷记应用的小额支付规范 >>里提出的。 可以这样理解,电子现金是PBOC里的一个应用,它基于借贷记. 这个应用被提出的目的就是实现我们经常听说的一个功能, 小额支付功能.
基于电子现金的卡目前来讲,一般有如下几个特点:
1 是由银行发行, 这个是必须的,否则就不会叫金融IC卡了.
2 卡里只有一个应用,也就是一个AID,因为目前国内推行PBOC的卡都是先从单应用开始做试点. 从卡片的角度来讲,实现多应用不成问题,但是, 如果卡片支持多应用, 还需要终端(包括圈存终端和消费终端)以及银行后台的相应配合, 这部分的工程量就很大了, 所以暂时以单应用为主.
3 一般用这张卡做小额支付,并且非实名制,消费无需密码,且是脱机消费.
4 这种卡一般只在银行内部或企业内部使用(企业内部也是与银行合作), 目前很难推广到一些大的公共事业中(比如交通), 因为这些行业是国家建设部管的, 这里面有很多非技术的原因导致银行这种金融机构与建设部难以坐在一起协商.
电子现金的应用, 主要做两种类型的交易,一是圈存交易,一是消费交易. 我这里以终端圈存交易为例,简单描述一下PBOC的交易流程.
所谓电子现金圈存, 是指把用户在银行帐户里的钱转到这张电子现金的卡上. 说白了就是从你的银行卡上转钱到电子现金的IC卡上. 由于目前还没有实现PBOC卡的多应用,整个圈存过程实际上需要两张卡,终端先读取银行卡信息(包括卡号,密码以及充值金额等信息), 扣费成功后下一步才是走PBOC交易流程,对电子现金卡写卡. 而推广PBOC的终极目标就是实现一卡多应用, 也就是说,未来的某个时候,就可以用一张卡完成圈存,只是不同的应用.
我这里简单通俗的介绍一下电子现金充值PBOC的流程. 更详细的内容可以直接看PBOC 2.0规范.
前面说到,电子现金应用是基于借贷记的, 所以它兼容借贷记应用,可以说是精简版的借贷记应用. 每一笔交易,所执行的PBOC流程就是简化版的借贷记流程.
第一步, 选择应用, 所用命令是select, 传的参数是 应用AID号. 这里跟标准的PBOC交易流程并不一样, 因为标准流程里面, 前面还有两步, 就是读取支付系统目录, 建立应用列表.为什么可以省掉这两步, 因为前面说到,卡里一般只有一个应用AID,目前还没有实现多应用, 这个AID号应该在卡片个人化时就已经固定好,只要你知道了该AID号,直接跳过前两步选择该应用可以了. 卡里只有一个应用,就无所谓应用列表了. 当然,一个好的程序设计建议还是走标准流程,这样,以后卡片实现了多应用, 你的终端程序也可以通吃.
应用选择后,卡片返回一串信息, 这串信息里面有个很重要的数据叫PDOL, 这是一个列表,卡片通过这个列表告诉终端,它需要哪些数据, 这些数据用来给卡片做应用初始化. 举个列子,比如卡片可能会需要授权金额(就是圈存的金额), 货币代码等数据. 终端程序解析PDOL,按照一定的规则拼接数据,进入第二步.
第二步, 应用初始化. 命令是GPO, 参数就是前一步根据PDOL所组的数据包. 该步表示终端通知卡片交易开始了. 卡片会返回AIP和AFL两个数据. AIP告诉终端卡片支持的功能, 比如卡片是否支持脱机数据认证, 是否支持发卡行认证等. AFL是要告诉终端, 如果要完成这笔交易,你终端该从卡上读什么数据。AFL里就包含了这些数据的位置和名称. 举个例子,这些数据可能有当前的交易序号,该张卡片的卡号(PBOC里叫PAN,应用主帐号)等.
第三步,读数据. 命令是read record. 参数是前一步得到的终端所需卡片数据的位置和名称. 终端要把AFL指定的所有数据读出,并保存到终端供下面的流程所用. 每次读到的数据是包含在卡片的返回信息中的, 终端解析返回信息,提取相关的数据
第四步, 产生应用密文. 命令是GAC. 参数是密文类型和产生密文所需的数据. 密文类型有三种,分别是交易证书(TC), 应用认证密文(AAC),授权请求密文(ARQC). 因为这一步是为下一步联机处理做准备,所以终端应用请求卡片产生的密文类型应该是ARQC,查看卡片是否允许联机处理.卡片收到产生密文类型后,返回的信 息有两个重要的数据, 第一个就是密文类型,该数据指示卡片是否愿意做联机处理,如果愿意,返回的是ARQC,与终端一致,否则返回AAC,表示拒绝联机. 终端判断卡片返回的是否是ARQC,如果是,终端要读取卡片返回的另一个重要的数据,应用密文(AC), 该密文是卡片用存放在卡里的密钥,对终端发过来的明文数据,用3DES算法生成的.
第五步, 联机验证卡片. 这一步,卡片本身没有操作. 终端把前一步得到的应用密文,产生应用密文的一些数据,还有其它的信息(比如交易日期,交易时间等),打包发送到发卡行PBOC后台, 通信方式一般是用TCP/IP。 后台通过验证ARQC密文来认证卡片, 如果认证成功会返回授权响应密文(ARPC), 这个ARPC是后台通过3DES算法,对ARQC密文和二个字节的授权响应码加密生成的.
第六步,第五步的目的是发卡行验证卡片的合法的性,这一步是卡片验证发卡行是否是 一个有效的发卡行. 命令是External Authentication, 叫外部认证. 参数是上一步联机处理响应的ARPC和授权响应码. 卡片收到命令后,会用自己的密钥,对ARQC和授权响应码生成ARPC,然后与终端传来的ARPC比较,两都相同,就认为此ARPC是来自一个有效的发卡 行后台.
第七步, 联机圈存报文, 验证了卡片和发卡行的合法性之后,终端向发卡行后台请求圈存,上传的数据包括充值金额,卡内原来的余额等信息, 发卡行后台返回一个写卡的脚本命令, 终端解析这个脚本,直接发给卡片即可. 到这里,卡片充值成功.
第八步,这一步要发送第二请求密文命令(GAC2), 它的作用说白了就是告诉卡片交易结束。与第四步的GAC1不同的是,GAC2的参数里面多了授权响应码,并且请求的密文类型是TC,也就是希望卡片接受交易。如果卡片返回的也是TC,表示接受交易.
第九步, 读交易日志,在整个流程执行的过程中,卡片会以一定的格式读录当前这笔交易的信息,比如授权金额,卡号,交易时间,终端只需通过一个命令就可以把些信息读出,然后提取出有用的信息,以便日后结算.
PBOC/EMV之文件结构
我刚看PBOC/EMV中IC卡的文件结构时,就被DF, MF, EF,DDF,ADF这些概念弄晕了. 无论是中文的PBOC文档还是英文的EMV文档, 对这几个概念讲解的都不够通俗. 不过这也不奇怪, 这种所谓的标准如果讲的太通俗,那么制定这些标准的人又怎么能够称得上是专家呢!
下面根据自己的理解, 把这几个概念讲解一下.
首先, MF, DF和EF这三个其实是iso7816里的概念. 是7816里规定的卡的文件结构. 这种文件结构是一种树形的结构. MF 可以理解为根目录,DF是目录,EF当成是目录里的文件. 所以MF其是也是一种DF,只不过是最上层的DF.
而ADF,DDF和AEF是PBOC/EMV里的概念. PBOC/EMV里定义的IC卡文件结构是符合ISO7816标准的. ADF和DDF其实是DF的两种映射, 而AEF是EF的映射. 程序访问时,访问的是ADF,DDF和AEF, 而不是DF和EF. 这种机制非常像操作系统的地址访问, 我们的程序不能访问系统的物理地址,而只能访问由这个物理地址映射的虚拟地址,而同一个物理地址可以是映射到不同的虚拟地址. 所以我们可以把DF, EF 理解成是物理文件结构,而ADF,AEF理解成虚拟的可供程序访问的文件结构.
ADF与DDF有什么区别呢? 简单来说,ADF就已经可以标识一个或一组应用(为什么有一组应用,因为有部分AID匹配, 具体可参考PBOC/EMV文档), 因为它就是应用的入口文件. 而DDF是个目录入口, 它下面有ADF,也有可能还是DDF, 当然也可能什么都没有, 总之它是一个目录. ADF用ADF名来标识应用, ADF名也就是AID. 一个AID代表一个应用,比如电子钱包应用,借记应用,贷记应用等等. AID 是由ISO这种组织来分配. 它分为两个部分, 前面是五个字节的RID, 这个用来唯一标识应用提供商, 后面最长是11字节的PIX., 用来标识某个专有应用, 它由应用提供商定义. 举例来说, ISO可能分给mastercard公司一个RID, 就叫A000000002(5个字节)吧, 然后master-
card 公司再用PIX定义一些应用,比如电子钱包, 假设它是0001吧. 我们如果看到一个AID是A0000000020010, 就知道这是master-card 定义的电子钱包应用.事实上一个符合EMV/PBOC L2标准的终端程序,就是以这些AID为中心在运行,简单说就是找到一个应用,然后处理(处理的过程可就复杂了).
PBOC/EMV在国内的推广带来不仅仅是卡片的变革,它势必引起整个行业的改变, 这其中就包括卡片的操作平台, 金融终端机. 这篇文章就说说,PBOC/EMV的迁移给圈存模式带来的变化.
目前很多圈存机所采用的圈存模式一般是脱机模式, 可以简单的用下图来表示
SAM卡是做什么用的呢. 要回答这个问题,首先你要明白一点,这种模式的圈存是脱机的.
既然是脱机,肯定要有一定的安全认证措施, 否则知道读卡器的模块相应的写卡指令, 任何人都可以写IC卡了.正是因为这个操作是可以脱机完成的, 一般采用SAM卡做这个安全认证, 这种SAM卡也叫ISAM,与读卡器模块构成一个整体. 这个SAM就可以起到读卡器与卡片相互认证的作用,认证双方都是合法的.认证的大致过程是这样的:
首先SAM卡存放一个主密钥, 发卡时,卡中存放用这个主密钥对IC卡的一些信息(比如卡号)加密生成的子密钥, 所以每张卡的子密是不同的.
当把IC卡插入读卡器时, SAM卡生成一个随机数,传给IC卡,IC卡用自己的子密钥加密该数据, 生成一个密文, 然后传给SAM卡,SAM卡读取卡号,用这个卡号生成一个密钥,我暂且把它叫密钥A,用A解密收到的密文, 与之前生成的随机数比较,如果相等, 则表示卡合法.
验证设备是否合法的过程是相反的.
再看看PBOC/EMV模式下的圈存是什么样的呢.如下图所示:
PBOC的IC卡是CPU卡, 里面完善的操作系统保证了它的灵活性, 硬件特性决定了它里面的密钥有极高的安全性. PBOC/EMV规范要求圈存交易也是必须有联机认证的, 并不是开机初始化时候进行一次,而是每一笔交易都要有这样一个规范流程. 这样一来, 圈存时SAM卡就可以不要了, 取之而来的是更安全的操作. 你可能会说,这样圈存速度就慢了, 但是,这又有什么关系呢, 又不是消费, 它的安全性更重要.
事实, 我个人认为, PBOC给圈存模式带来的变革不仅仅是安全方面的.
我把SAM加读卡器一起叫做卡操作模块, 这种模式下, 一般卡操作模块和IC卡都是一家公司提供, 然后它有一套指令集, 所有的操作都是用这个指令集. 除了这家公司提供的卡操作模块, 市场上不可能有任何一个卡操作模块可以读写这张IC卡. 而因为PBOC/EMV的卡操作指令都是业界的一种标准了, 只要是符合这个标准的读卡设备都可以对卡进行读写操作. 这样一来, 读卡模块和卡片就可以由不同的公司来提供了, 原来的纵向产业模式就变成横向的了.
记得以前看英特尔总载写的<<只有偏执狂才能生存>>这本书,他在里面提到PC机行业不可避免的要从纵向产业链向横向转变. 有公司没有看到这个趋势, 结果走下坡路, 比如IBM. 而dell意识到了这个问题, 才成就了今天的dell王国. 其实这种横向模式在很多行业里都是一种趋势.
ATM机最初都是由一家公司做一个整机, 这种模式无论对客户(一般是银行)还是对行业的发展都是不利的. 对银行来说,这种模式下, ATM的价格贵的让人难以接受. 对行业来说,不利于竞争, 没有竞争就没有发展. 再看看现在的ATM行业, 读卡器由A公司做,密码键盘由B公司做, 现金识别模块可能是由C公司做, 多家公司的产品最终拼成了一台ATM机, 这种横向的产业模式带来的是价格的自然降低, 整个行业因竞争而欣欣向荣.
金融智能卡操作系统安全体系研究
摘要:讨论了通用智能卡操作系统COS的安全体系,围绕该体系的三大功能:文件操作、认证系统、加/解密展开论述.金融智能卡操作系统是建立在通用COS 基础上集成了银行应用的COS.结合实践的JETCOS智能卡操作系统分析了金融智能卡COS在交易流程和应用过程中的安全性。
关键词:芯片操作系统;访问控制;认证;密钥管理;圈存
智能卡又称为IC 卡( Integrated circuit Card) , 即集成电路卡。根据卡中使用的集成电路的不同可以分为存储器卡、逻辑加密卡和CPU卡。由于CPU卡中集成了中央处理器CPU、存储器和芯片操作系统( Chip Operating System, COS) , 构成一个完整的计算机系统, 具有独立的数据处理能力, 因此安全性大大增强, 从而得到了广泛的应用, 成为IC 卡中的主流产品。本文主要针对CPU 卡进行讨论。COS 建立在CPU、存储器等硬件之上, 是管理芯片资源和实现安全保密的操作系统。它的主要功能是: 控制智能卡和外界的信息交换, 管理智能卡内的存储器, 并在卡内部完成各种命令的处理。
1 安全体系
根据接触式集成电路( IC) 卡国际标准ISO7816-4, 智能卡安全体系包括三部分: 安全状态( Security Status) 、安全属性( Security Attributes) 以及安全机制( Security Mechanisms) 。安全状态是指智能卡当前所处的安全级别, 即当前安全状态寄存器的值。安全属性又称为访问权限, 即在进行某种操作时要求安全状态寄存器的值是什么。安全机制从广义上说是卡片支持的各种安全模式, 从狭义上说是安全状态实现转移所采用的方法和手段。一种安全状态通过上述安全机制转移到另一种状态, 把该安全状态与某个安全属性相比较, 如果一致, 则表明能够执行该属性对应的命令; 如果不一致, 则相关命令不能被执行, 从而达到了安全控制的目的。这就是智能卡安全体系的基本工作原理, 如图1 所示。
图1 智能卡安全体系
安全机制是安全体系的关键, 广义的安全机制主要涉及到文件操作、认证系统、加/ 解密三大功能模块。
2 文件操作
2. 1 基本文件结构
文件系统是COS 的基础模块, 它负责组织、管理、维护IC卡内存储的所有数据。根据ISO7816-4, COS 支持的文件类型为: 主文件( Master File, MF) 、目录文件( Dedicated File, DF) 和基本文件( Elementary File, EF) 。主文件MF为文件系统的根,下面可以有多个目录文件DF 和基本文件EF。目录文件DF分为DDF 和ADF 两种。DDF可以含有下级目录ADF, 而ADF不能含有下级目录文件。
主文件MF 在IC 卡中唯一且必须存在。DDF 是指包含多个应用的DF, 一个ADF则代表一个应用, 任何一个DF 在物理上和逻辑上都保持独立。基本文件EF 用于存放密钥或用户数据, 分为密钥文件和工作基本文件。
2. 2 文件的访问控制
文件的访问控制可采取鉴别寄存器方式和状态机方式, 这里以鉴别寄存器方式为例。用两个四位寄存器来表示安全状态: 一个寄存器称为MF 的安全状态寄存器, 另一个寄存器为当前DF的安全状态寄存器。每个寄存器的初始值是0, 取值安全状态员安全状态圆执行命令符合命令要求的安全属性钥命令拒绝安全机制再晕图员智能卡安全体系范围是0 ~F 之间的某一个值。文件有两种不同的访问控制权限AC0, AC1。AC0 是使用权限, AC1 是修改权限, 分别用一个字节表示。当前安全状态寄存器的值大于AC 字节的低半字节小于其高半字节时, 该文件的相应读、写权限在该安全状态下被满足, 则能进行相关操作。COS在建立文件时指定其AC0和AC1 的值来对文件的访问权限进行设定, 通过口令校验和外部认证两条命令可以改变安全状态寄存器的值, 从而利用安全机制实现对文件的访问控制。
3 认证系统
3. 1 用户鉴别
用户鉴别( Verify) , 也称为口令校验, 是指智能卡对其持有者合法性的验证, 以减少被非法用户冒用的可能。具体实现上, 由用户向智能卡出示只有他本人才知道的通行字PIN, 并由智能卡对该Password 的正确性进行判断。如果正确, 则验证通过, 改变智能卡当前的安全状态为PIN后续状态从而用户获得相应使用权限; 如果不正确, 则错误计数器的值减1, 若错误尝试次数达到错误计数器的上限, 则卡会自动锁定。
3. 2 内部认证和外部认证
内部认证( Internal Authentication) , 是指读写设备对智能卡的合法性进行的验证; 外部认证( External Authentication) , 是指智能卡对读写设备的合法性进行的验证。内、外部认证的原理是合法的读写设备和智能卡应该共有相应的内、外部认证密钥, 伪造的读写设备或智能卡无法获得相应密钥。具体实现上, 是通过读写设备和卡双方同时用对称加密算法对一个随机数进行加密运算, 然后判断双方运算结果的一致性或者通过一方对随机数加密另一方进行解密来达到认证的目的。类似于口令校验, 外部认证通过后, 当前安全状态寄存器的值变成外部认证密钥的后续状态。
3. 3 安全报文传送
为保证卡与外界传输的信息的安全性, 除了明文方式传递数据外, COS 提供安全报文传送方式, 其目的在于保证数据的可靠性、完整性和对发送方的认证。数据完整性和对发送方的认证通过使用消息认证码MAC( Message Authentication Code)来实现。数据的可靠性通过对数据域的加密得到保证。
MAC 是消息内容和秘密钥的公开函数, 其输出是定长的短数据块: MAC = C( M, K) 。其中M是消息内容, K 是通信双方共享的秘密钥, C 是MAC 值的生成算法。算法C 要求已知M1 和C( M1 , K) , 无法构造出满足C( M2 , K) = C( M1 , K) 的报文M2 , 所以MAC 能唯一鉴别原报文。COS支持如下两种安全报文传送方式:
( 1) 线路认证方式。终端对要发送给卡的整条命令计算MAC 值, 并附加在传输的命令数据的尾部, 即A→B: M‖ C( M, K) , 卡收到命令后用秘密钥K 对接收到的M求MAC 值,并与C( M, K) 比较, 从而验证MAC 值的正确性, 只有校验正确的数据才予以接收; 卡如果有返回给终端的应答数据, 也同样以线路认证方式发送。如果M 被窜改, 收方据此计算出的MAC 值就与发方传送过来正确值不同; 如果有冒充的非法发送端发送消息, 由于它得不到秘密钥K, 所以也无法得到正确的MAC 值。因此这种方式能保证传输数据的完整性和发送方的真实性。
( 2) 线路加密认证方式。终端对要发送给卡的命令数据域加密, 然后再对整条命令( 包括命令头和加密后的命令数据域) 计算MAC 值, 并附加在被加密了的命令数据的尾部, 即A→B: E( M, K2 ) ‖C( E( M, K2 ) , K1 ) , 卡收到命令后首先用K1验证MAC 值的正确性, 再用K2 对命令的DATA 域数据解密,恢复命令数据域的明文; 卡如果有返回给终端的应答数据, 也同样以线路加密认证方式发送。由于传送的是加密后的密文,仅由收、发双方共享K2 , 所以线路加密认证方式除了提供线路认证方式的优点外, 还能保证数据的可靠性。
4 加 / 解密
4. 1 密钥管理
COS 的密钥管理涉及密钥的生成、分配、存储和使用。根据密钥分级原则, 把智能卡中涉及的密钥划分为三级: 主密钥、二级密钥、初级密钥。高级密钥生成低级密钥。低级密钥由高级密钥管理控制, 可以减少直接保密的密钥数量, 简化密钥管理, 保证密钥安全。主密钥由应用管理机构产生和维护, 二级密钥由主密钥通过某种算法分散到每张IC 卡中, 过程密钥由每次交易具体涉及的数据产生。
根据全程安全原则, 安全管理贯穿密钥的生成、分配、存储和使用的过程。
主密钥是在安全保密的情况下由管理机构产生的真随机序列。根据责任分离原则, 一个密钥专职一种功能, 所以根据COS 应用中涉及的业务种类, 应生成对应个数的主密钥。子密钥, 即二级密钥, 由对应的主密钥对每张用户卡唯一的应用序列号进行加密生成。过程密钥, 即初级密钥, 由二级密钥对每次交易的某些具体数据进行加密生成。
主密钥采用人工分配的方式, 以确保高安全性。子密钥在管理机构由主密钥产生, 再下载到每张卡中。过程密钥在卡中生成, 采用“一次一密”方式, 只在当次交易有效, 保护该次交易的敏感数据。
主密钥存储在管理机构中, 生存周期长, 安全性要求最高,存储在高度安全的专用密码装置中。子密钥存储在MF或DF下的密钥文件中, 在整个MF或DF的建立到删除过程中有效。过程密钥由于只对一次特定的交易有效, 所以生存周期短, 使用时动态产生, 存储在卡的内存中, 使用完毕即销毁。子密钥和过程密钥在卡中以非可见的形式存放, 任何时候都不能出卡, 不能被显式读取。COS 设定了每个密钥的安全条件, 只有满足特定的安全状态, 才能使用或修改该密钥。当某些密钥( 如个人PIN) 受到非法攻击时, 还能够自动锁定, 以确保密钥的抗攻击性。
4. 2 密码算法及应用
4. 2. 1 对称密码算法
DES, 3DES, AES 是普遍使用的对称密码算法。COS 中涉及内外部认证、安全报文、生成过程密钥等均用到了对称密码算法。图2 说明安全报文传送中MAC 基于DES 算法的生成过程。其中, D 表示被加密的数据被分成的八字节数据块, ī表示异或, 最终得到的八个字节结果取左边四个字节作为MAC 值。
图1 基于DES的MAC算法
4. 2. 2 非对称密码算法
利用公开密钥密码实现数字签名方便安全, 如果COS 支持公开密钥密码, 由于其具有独立的数据处理能力和良好的安全性, 则IC 卡可作为数字签名的安全载体。用来签名的私钥保存在卡中, 并且任何情况下不能读出。签名的过程在卡中完成, 比在主机上用私钥实现签名更安全。目前可用于COS 的非对称算法有RSA, ECC 等。出于对安全和速度的考虑, 一般不是对数据直接签名, 而是对其哈希值进行签名。
5 金融智能卡COS 的安全性
金融智能卡操作系统是建立在通用COS 基础上集成了银行应用的COS, 其中电子存折和电子钱包是两种最主要的金融应用, 能支持圈存、圈提、消费、取现和修改透支限额五种类型的交易, 可用来代替流通领域的现金、支票, 成为电子货币的方便载体在金额领域使用, 所以对其安全性的要求更高。金融COS作为通用COS 的具体应用, 除了在交易流程上依赖于通用COS的安全体系, 还有金融交易其特有的安全措施。下面结合JETCOS 详细说明金融COS 的交易流程和应用安全。
5. 1 交易流程
圈存是将银行账户上的资金划转到电子存折或钱包的交易; 圈提是将电子存折中的资金划转到银行账户的交易; 消费是使用电子钱包或电子存折在银行POS 机上消费的交易; 取现是使用电子存折在银行终端上支取现金的交易; 修改透支限额是修改电子存折透支限额的交易。以下以JETCOS 的电子存折圈存交易为例说明安全交易的流程( 图3) 。
图3 圈存交易处理流程
( 1) 终端按照应用协议数据单元( Application Protocol DataUnit, APDU) 的格式向IC 卡发圈存初始化命令启动圈存交易:CLA INS P1 P2 Lc DATA Le80 50 00 01 0B 密钥标识符+ 交易金额+ 终端机编号10由CLA, INS, P1, P2 共同指定该条命令是电子存折的圈存初始化, Lc 指示DATA 的长度, Le 指示该命令完成后期望返回的数据长度。
( 2) IC 卡进行圈存初始化。首先将命令DATA 域中的交易金额加上存折的余额检查是否超出存折存钱的上限, 如溢出则返回错误码“6985”( 金额上溢) , 否则继续执行; 然后根据DATA 域中的密钥标识符查找卡中的圈存密钥, 利用此密钥对产生的伪随机数、联机交易序号和“8000”加密生成过程密钥;再用过程密钥对交易金额、终端机编号等信息生成MAC1, 并向主机发送MAC1 和生成MAC1 的各项, 以供主机验证IC 卡的合法性。由于每次交易的伪随机数和交易序号不同, 所以过程密钥也不同。采用“一次一密”的方式, 确保了当次交易敏感数据的安全性。圈存初始化命令成功执行后返回的响应报文域为:DATA SW1 SW2原余额+ 联机交易序号+ 密钥版本号+ 算法标识+ 伪随机数+ MAC1 90 00其中DATA 域是传递给主机的数据, SW 是返回码, “9000”表示该命令成功执行。
( 3) 主机进行主机端的圈存处理。由于主机已经装载了圈存主密钥, 所以主机可以根据卡的应用序列号计算出该卡的圈存子密钥, 再由IC 卡传递的DATA 生成过程密钥和相应的MAC 值与MAC1 比较, 如不相同则返回错误码“9302”( MAC错误) , 否则继续执行, 从而保证了IC 卡传递数据的完整性和主机对IC 卡身份的认证。确认有效后主机从银行账户中扣除圈存金额, 并产生报文鉴别码MAC2, 用于IC 卡对主机进行合法性的认证。
( 4) 终端向IC 卡发圈存主过程命令, 其中DATA 域数据由主机端交易生成:CLA INS P1 P2 Lc DATA Le 80 52 00 00 0B 交易日期+ 交易时间+ MAC2 04
( 5) IC 卡进行圈存主过程。利用当次交易的过程密钥和主机传递DATA 的相关项生成MAC 值, 从而验证MAC2 是否有效。确认有效后, 完成实质性交易: 交易金额加在余额上, 更新联机交易序号, 更新交易明细文件, 并用TAC 密钥根据交易后的新余额、交易序号、交易时间等当次交易相关信息生成当次交易验证码TAC( Transaction Authentication Code) , 用于主机对IC 卡端圈存交易成功与否进行验证。圈存命令成功执行后返回的响应报文域为:DATA SW1 SW2TAC 90 00
( 6) IC 卡将TAC 传递给终端, 可供主机以后验证此次交易成功与否。
5. 2 应用安全
( 1) 交易状态机。一个完整的金融交易包括交易初始化和交易主过程, 初始化和主过程必须是同一种类型的交易。卡片的状态有: 空闲状态, 圈存状态, 圈提状态, 消费/ 取现状态和修改状态。仅当交易初始化后进入相应的交易状态, 同一类型的交易主过程才能进行。用内存系统区PSW 这个字的低五位标志五种状态。例如卡片初始状态是空闲态, 执行圈存初始化后, PSW 的b1 位被置为1, 即交易状态为圈存态。执行圈存主过程时, 先检查该位是否为1, 如果是, 则执行圈存主过程, 执行成功后置PSW 回空闲态; 如果不是, 则返回错误码“6901”( 状态无效) , 圈存主过程不被执行。表1 说明交易状态机的各种变化: 交易初始化可以在任何状态下执行, 执行后交易状态改变为初始化相应的状态; 交易主过程必须在相应的交易状态下才能执行, 执行后返回空闲态; 如果交易主过程的类型和交易状态不匹配, 则主过程不被执行。取余额和取交易认证可以在任何状态下执行, 并且不影响当前交易状态。
表1 交易状态变化
( 2) PIN验证。通用COS 的用户鉴别是指COS 对用户身份的认证, 并能改变当前安全状态, 但用户鉴别并不是必须的,这里的PIN验证是特定的金融交易类型要求的对用户身份的验证。除了电子钱包消费不用校验PIN, 其他各种交易类型都必须提交个人密码( PIN) , 这里也是通过判断PSW 值来检查是否已经校验PIN。PSW 的b9 位作为PINVer_OK 标志位, 当用户从金融终端输入合法的个人密码, 通过口令校验, 同时置该位为1。交易初始化时检查该位是否为1, 如果是, 继续执行, 否则返回错误码“6982”( 安全状态不满足) 。
( 3) CRC 校验。交易初始化时从存折/ 钱包文件中读取相关信息, 交易主过程时更新存折/ 钱包文件都需要读写FLASH存储器, 再读取前校验CRC, 更新后重新计算CRC 并写入FLASH 中相关文件的头部, 以便下次校验, 从而保证了读写物理过程的安全性和文件的完整性。
( 4) 备份写。智能卡能够在交易处理时, 包括拔卡或掉电的情况下, 保持数据的完整性, 这需要保证每次交易的所有更新一次性完成。为此JETCOS 中在FLASH 中开辟FL_RESTOREBUF区作为写入缓冲区, 每次交易需要对FLASH 更新的数据不是直接更新, 而是先写入FL_RESTOREBUF 区, 并置标志位FL_RESTORETAG 为0; 当交易处理完, 调用RestoreData子过程, 检查此时FL_ RESTORETAG 为0, 则从FL_ RESTOREBUF区依次更新到FLASH 的相应地址, 如果都更新成功, 则重置标志位FL_RESTORETAG 为1。更新FLASH 的过程中若遇到拔卡或掉电, COS 会在初始化时再次调用Restore-Data。如果第一次RestoreData 未进行成功, 则FL_RESTORETAG为0, 那么重新更新FLASH 的相应地址; 如果第一次RestoreData成功进行, 则FL_RESTORETAG 为1, 那么不必再次恢复数据。这种机制保证了拔卡或掉电时更新数据的一致性。
6 结束语
COS 的安全性是基于软件的安全, IC 卡系统的安全还需要对抗硬件攻击、分析攻击、应用攻击和系统攻击等。智能卡,尤其是金融IC 卡, 目前在金融系统还未得到广泛使用, 尚需要从硬件、稳定性、使用环境各方面加强抗攻击能力, COS 也必须相应加强反调试跟踪的能力。( 文/武汉大学计算机学院, 杨帆, 张焕国)
金融IC卡文件结构及访问机制
金融IC卡作为新型的金融品种,在银行业务中的应用越来越广。各发卡行推出的金融IC卡必须符合统一的文件结构规范,才能够共享POS机和圈存机等端末设 备。本文阐述了符合人民银行统一规范和符合ISO/IEC 7816-4规范的金融IC卡文件体系结构,对金融IC卡的文件访问机制做了简要说明。
一、金融IC卡文件组织结构
IC 卡操作系统(COS)的文件系统是三层的物理结构,即由主控文件(MF,Master File)、专有文件(DF,Dedicated File)和基本文件(EF,Elementary File)组成一个类似于DOS的层次结构。
1.主控文件是整个文件系统的根。每张卡有且只有一个主控文件,它在卡的个人化过程中首先被建立起来,在卡的生命周期中一直存在并保持有效,可存储卡的公共信息并为各种应用服务。通过个人化建立起来的主控文件包括文件控制参数和文件安全属性等信息。
2.专有文件是在MF下针对不同应用建立起来的一种文件,是位于MF之下的含有基本文件的一种文件结构,它存储某个应用的全部数据以及与应用操作相关的安 全数据。DF由创立文件命令建立,对DF的建立操作由MF的安全属性控制。在DF下一般不再建立子 DF,只建立基本文件EF。一个DF对应一种应用。
3.基本文件存储了各种应用的数据和管理信息,它存在于MF或DF下。EF从存储内容上分为两类:安全基本文件(SEF,Secret Elementary File)和工作基本文件(WEF,Working Elementary File)。
安全基本文件包括用于用户识别和与加密有关的保密数据(个人识别码、PIN)等,其内容不允许被读出,但可以用专门的指令修改和写入。在MF和每个DF下面只能有一个安全基本文件,文件中的KEY和PIN的类型和修改权限可以指定。
工作基本文件包含应用的实际数据,在符合WEF的读写等安全属性时可对其进行操作,其大小和个数受到MF和DF所拥有空间的限制。整个文件系统的空间在MF、DF和EF创建时被分配和确定,在物理上不再变化。要访问某个EF,必须先选择相应的MF和DF。
除了金融IC卡的文件基本结构,卡片同时支持其他专有应用,其中DF1表示金融应用。它和其他应用一起建立在MF下。在MF和DF下都存在一些基本文件。下面是一些基本文件在金融应用中的说明。
ATR文件:复位应答文件,在卡片复位时获得应答信息。
KEY文件1:主控MF下密钥文件,存放卡片主控KEY、外部认证KEY等密钥。
目录文件:存放金融应用和其他专业应用的名称目录索引。
专有文件DF1:金融应用专有文件,在该应用下创建的文件由金融应用调用。
KEY文件2:金融应用下密钥文件,存放金融应用主控KEY、圈存圈提密钥、消费密钥、TAC密钥、MAC密钥、修改透支密钥、重装PIN密钥、解锁PIN密钥等密钥。
EF0015:金融应用公共基本信息文件。
EF0016:金融应用持卡人基本信息文件。
ED文件:金融应用电子存折文件。
EP文件:金融应用电子钱包文件。
EF0018:金融应用交易明细文件,自动记录每次圈存、圈提、消费的交易明细,能容纳10条最新的交易记录。
二、金融IC卡文件访问
金融IC卡的访问起始于一个名为1PAY.SYS.DDF01的初始文件,通过该文件找到金融支付环境必须存在的目录数据文件(DDF)。这个DDF被映 射到卡片的MF,包含了支付系统的目录。当卡片选择这个DDF文件时,从该文件的文件控制信息(FCI)中可以得到支付系统目录文件的短文件标识 (SFI)。
DDF中的每一条记录对应着卡片中不同的应用数据文件(ADF)的入口地址,它包含应用的名称、应用的标签、选择应用的命令和应用的入口地址等。目录可以 使用READ RECORD命令进行读取,并获得所要选择应用的应用标识符(AID)。除金融应用外,该目录文件还可以包含其他应用的入口地址,但该目录不要求包含卡片 上所有的ADF入口地址,也不要求沿着DDF的连接一定能够找到卡片支持的全部应用。但只有从初始目录开始,沿着DDF的连接能够找到应用,才具备国际互 通性。金融应用的访问要求符合这个互通性。
在支付系统目录中,每一个应用标识符对应一个应用数据文件(包括金融应用)的入口地址。应用标识符的结构必须符合ISO/IEC 7816-5,通过应用标识符,用SELECT命令能选择所要操作的应用DF,并返回该应用的文件控制信息(FCI)。
除了初始文件外,其他目录在支付系统环境下是可选的。每一个目录由一个目录短文件标识码定位,它存放在每一个DDF的FCI中。当包含该目录的DDF为当 前选定的文件时,可通过SFI来定位某一应用。如果在这一DF下不存在下一级的DF(例如金融应用),则不需要在DF中建立DDF文件。
当卡片成功选择金融应用的专用文件后,该专用文件被设置为当前文件应用,并允许使用金融应用的特殊命令来对其操作,包括电子钱包和电子存折的应用。
其他基本数据文件的选择可以通过READ命令并采用SFI方式实现。用文件的短文件标识符发出读记录命令来选择EF,但命令只对当前应用(目录)下的文件有效。
三、金融IC卡文件操作
在金融交易中,IC卡文件的操作(包括访问、查询和修改)并不是直接修改和编辑文件,而是对COS发送相应的操作指令,而操作指令必须在符合安全规范的前 提下才能被执行。在电子存折/电子钱包应用的执行过程中,卡片总处于某种状态。在某一种状态下,只有某些命令能够被执行。
卡片所处的状态有以下几种:空闲状态、圈存状态、消费/取现状态、圈提状态、修改状态。
当应用选择完成后,卡片首先进入空闲状态。当卡片从终端接收到一条命令后,它必须先检查当前状态是否允许执行该命令。当命令成功执行以后,卡片进入另一个状态(或同一个)。如果命令执行不成功,则卡片进入空闲状态。
第一行表示命令发出时卡片的当前状态,第一列表示发出的命令,而整张表给出的是在当前状态下某个子命令执行成功后的状态。阴影部分表示指令在卡片处于相应 状态时发出的命令是无效的。在这种情况下,卡片不执行该命令,并向终端返回“6901”状态码“命令不接受(无效状态)”,同时卡片返回空闲状态。
IC卡的文件结构和访问控制有其独立性,并由卡片操作系统完成。而针对IC卡片的操作,只需按应用访问到相应的文件并发出相应的指令,由卡片根据文件的结构来进行相应的读写操作,从而使金融IC卡文件具有更高的安全性。
PBOC/EMV之静态数据认证(SDA)与动态数据认证(DDA)
PBOC/EMV里有两个非常重要的概念, SDA(static data authentication)和DDA(dynamic data authentication),分别叫做静态数据认证和动态数据认证. 这两个认证都是脱机下(off-line)的认证. 业内人都知道磁卡和IC卡迁移的一个很重要的原因就是安全问题.
举两个磁卡犯罪的例子:
1 磁卡本身的构造原理使得它的数据非常容易被非法修改, 你肯定不愿意有人非法修改你卡上的数据, 当然如果是在你的余额后面加几个0就另当别论了.
2 相信下面要举的这个例子, 很多人都听过: 犯罪分子要用两个设备, 读卡器和针-孔-摄(注释)像(和)机. 他们把读卡器与银行原来的读卡器固定一起,插卡口对齐, 当我们取钱时把卡插进去时, 我们的卡上的信息就被他们的读卡器读出, 然后他们用一张空白的卡就可以把我们的卡复制出来. 针孔摄影机的作用就是当我们取钱时窃取我们的密码. 卡有了, 密码也有了,剩下的步骤就是取钱了.
SDA可以解决上述第一个问题, 它实现的原理是数字签名. 简单的说, 过程如下: IC卡的里的数据先签个名, 怎么签名呢? 当然不是用笔直接上面写个名字. 它的做法是用Hash为这些数据生成一个简短表示做为该数据的摘要, 然后,把这个摘要加密,得到一个"签名". 再把数据和加密后的签名发给终端. 终端在这一头先把收到的数据Hash,得到一个签名, 然后再把收到的加密签名解密,又得到一个签名, 比较两个签名,就可以知道数据有没有被修改过,如果数据被修改过, 两个签名是不同的. 验证不会通过.
DDA除了具有SDA的功能外,它最强大的地方就是解决上述第二种犯罪. 它实现的原理如下: 与SDA相比, 它的签名是动态的. SDA的签名在卡发行时就定好的, 它加密所用的私钥是发卡行的私钥(如果你不理解私钥和公钥的概念, 建议先看一下密码学的相关知识). 而DDA每次用来的签名的数据是当前交易中的一些动态数据, 签名加密所用的私钥是IC卡私钥, 这个私钥贮存在IC卡的一个安全区域里(这个很重要). 终端这一头有与之相对应的用来解密的公钥. 那么怎么实现防复制呢?
举个例子说, 张三的卡被李四复制了一张, 李四拿着这张卡去取钱. 在交易时,IC卡会生成一个动态的签名给终端确认, 关键的地方就在这里, 这个动态的签名需要一个私钥来加密, 而这个IC卡私钥贮存在IC卡里的安全区域里,李四不可能知道, 李四随便选一个私钥来加密签名, 所以在终端这一头的验证肯定是通不过的,因为公钥和私钥已经不对应了. 那么交易肯定会被强制中止, 张三卡里的钱也就不会被李四取走.
DDA实在是太强大了, 可以想像如果以后我们用的银行卡全部都是有DDA功能的IC卡, 将极大减少金融犯罪. Visa和master 公司已经宣布2011年之后, 欧洲所有银行发行的具有脱机功能的IC卡都要使用DDA