Chinaunix首页 | 论坛 | 博客
  • 博客访问: 754662
  • 博文数量: 98
  • 博客积分: 4934
  • 博客等级: 上校
  • 技术积分: 1151
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-12 19:55
文章分类

全部博文(98)

文章存档

2014年(1)

2013年(2)

2012年(4)

2011年(25)

2010年(33)

2009年(33)

分类: 嵌入式

2010-11-11 15:54:07

DASSCOS的安全策略

欧钰鹏 杨瑞霞
济南得安计算机技术有限公司

摘要:近几年来,社会保障个人卡(简称社保卡)的应用越来越广泛,它的安全性也日益受到人们的重视。本文结合社保卡的应用,着重介绍了DASSCOS所采取的安全策略,并详细论述了安全策略的具体实现。
关键词: 社保卡,安全策略,COS,密钥

引言
         智能卡的特点是使用方便、安全和更易于实现信息数字化管理。随着养老保险、医疗保险的社会化,以及社会保障体系的完善,社保卡在全国各地的医保系统中得到了越来越广泛的应用。
         由于社保卡的应用范围较广,涉及到一个城市乃至全国参加养老保险、医疗保险的人员,而且使用过程中还具有帐户金额划入、医疗消费等功能,所以社保卡系统的安全可靠性显得尤为重要。
         DASSCOS是济南得安计算机技术有限公司自主开发的社保卡COS(卡操作系统Card Operate System),为了保证社保卡在应用过程中的防伪性、操作的安全性以及数据的保密完整性,DASSCOS采取了一系列的安全措施来构筑安全的长城。
一、 密钥的安全管理
密钥是保证社保卡的安全性的关键要素,因为密钥控制着卡内所有文件的访问。社保卡内使用的密钥有几十个,按功能可以划分为应用维护、锁定控制、应用数据更新、交易和应用数据读取等多个类型。对卡片的很多操作都需要对密钥进行认证,取得相应权限后才能进行。正因为密钥是如此的重要,所以社保卡对密钥的管理是非常严格的。
每个卡片所使用的卡内密钥,都是通过三级分散来确定的,这样可以保证密钥的独立性,为卡片的安全应用提供强有力的保障。根据发卡过程的要求,卡片在发行中需实行主管机构与卡片发行中心两级密钥管理体制,对密钥进行三级分散。社保卡主管机构作为社保卡的密钥管理中心,它产生发行单位的根密钥(包括发卡授权密钥等),把根密钥传递给二级密钥管理中心,即社保卡的发行中心,由发行中心进行下一步的工作。卡发行中心从主管机构得到根密钥后,进行二次分散,得到各种密钥的母密钥,然后把相应的母密钥装载到SAM(安全存取模块Secure Access Module)卡及发卡母卡上。在卡片发行的时候,由发卡母卡上的各个母密钥根据每个社保卡的卡号,分散出每个社保卡上所使用的子密钥。
每个社保卡的子密钥是用卡片ATR(复位应答Answer To Reset)的T8-TD字节(卡号),加上‘00 00’作为分散因子,对母密钥分散得到的,其计算方法如图1、图2所示:


图1 单DES分散算法


图2 3DES分散算法

社保卡为了增强与应用终端的认证程度和增加数据加密的安全性,卡片要求在报文的安全传送和交易的过程中使用过程密钥。过程密钥是对应使用的子密钥进行DES或3DES(原密钥长度为16字节时)加密运算产生的。
在报文安全传送过程中,无论是对MAC(报文鉴别代码Message Authentication Code)的计算还是数据加密,都使用了过程密钥。在这里使用的过程密钥是这样产生的:通过IC卡获取8字节的随机数作为输入数据,与原密钥进行加密运算,得到8字节的过程密钥。
社保卡在交易过程中也需要产生过程密钥,产生过程密钥所使用的输入数据有所不同,当进行帐户划入交易时,输入数据是由以下几部分组成的:4个字节的随机数,基本医疗保险个人帐户划入交易序号和十六进制数‘80 00’。输入数据与DLK密钥产生帐户划入交易使用的过程密钥;当进行医疗消费交易时,产生过程密钥的输入数据为:4个字节的随机数,医疗消费交易序号和终端交易序号的最右两个字节。输入数据与DPK密钥产生医疗消费交易使用的过程密钥。
社保卡在产生过程密钥的过程中,保证每一次使用的随机数都是新的,如果没有产生新的随机数就进行相关操作,卡片会返回错误信息。只有这样才能真正的做到每操作一次都使用一个新的过程密钥,这样才能更好地保证数据的安全。
此外,社保卡的密钥管理还有一个类似于“防火墙”的功能,即除PIN(个人密码Personal Identification Code)外的所有密钥不能跨应用使用。当终端选择了社保卡其中的一个应用后,该应用中的所有授权操作都是由此应用中的密钥进行控制的。如果要对别的应用进行操作,则必须选择相应应用后,对其中的密钥进行相关验证,获得权限后才能进行操作。也就是说,进行跨应用操作时,原来权限将会丢失。

二、 操作权限的鉴别与获取
在对社保卡进行操作之前,应用终端必须对卡片进行有效性检查,检查卡片是否有效或者说确认卡片是否可以在社保应用环境中使用。这个检测过程通过进行内部认证来实现。内部认证是社保卡COS系统的一个命令,其具体实现过程如下:
1、 终端产生每组为8字节的两组随机数。随机数可以通过软件生成,也可以通过SAM卡或社保卡的取随机数功能来获得;
2、   终端对卡片发出内部认证命令,两组随机数放在数据域中发给卡片;
3、卡片接收到内部认证命令后,通过命令中的密钥标识符找到相应的密钥,与第一组随机数产生过程密钥,然后对第二组随机数进行加密运算,把结果作为鉴别信息回送给终端;
4、 终端在发出命令后,进行与卡片同样的运算过程,在接收返回信息后,对鉴别信息进行比较验证。
只有在内部认证通过的情况下,终端才会对卡片进行后续操作。验证通过后,终端可以读取片片的相关信息,检查卡片的有效性。
内部认证可以实现终端对社保卡的鉴别,而IC卡中的应用验证终端的有效性以及让终端获得某种操作的权限,则需要通过外部认证来实现。外部认证也是社保卡COS系统的一个命令,其具体实现过程如下:
1、   终端通过取随机数命令获得社保卡产生的8字节随机数Rc;
2、   终端产生8字节随机数Rt(也可从SAM获得),然后用指定的密钥与Rc产生过程密钥,再用过程密钥对Rt进行加密,产生鉴别数据;
3、 终端对卡片发出外部认证命令,把鉴别数据和Rt发送给卡片;
4、卡片根据命令的参数找到相应的密钥,与保存的Rc产生过程密钥,对接收到的Rt进行加密运算,再与接收到的鉴别数据进行比较验证。
当验证通过后,卡片记住该密钥成功鉴别的结果,直到断电或选择别的应用。终端则通过对密钥的外部认证获得了该密钥所控制的权限,可以进行相应的操作。
另外,对持卡人PIN的验证也可以获得相应的权限。PIN的验证是通过社保卡COS的口令验证命令进行,卡片通过比较命令数据域中的PIN与卡内保存的PIN是否一致来决定是否授权。

三、 重要报文的安全传送
在卡片与应用终端进行信息交换过程中,有持卡人的PIN、保险金额等重要的信息。这些信息如果被窃取或篡改,后果是相当严重的。社保卡采取验证MAC来保证报文的完整性,通过对交换信息的加密来保证信息的保密安全性。
当命令数据采用安全报文传送时,要求对方进行MAC认证或加密传送。MAC要进行验证的数据是COS的命令头和命令数据域中的数据元。MAC认证码是通过过程密钥对数据进行DES运算得到的长度为4个字节的数据元,它在通信过程中附加在命令数据域的最后,发送到对方。当接收方接收完命令的所有数据后,需要对数据进行相应的运算,也计算出一个MAC码,与发送方的MAC码比较,进行比较后二者相同时才认为接收的命令是完整的、正确的。
计算MAC认证码的过程如下:
1、   用COS命令头及命令数据域中的明文或密文数据组合成要认证的原始数据块;
2、   将原始认证数据块分为以8个字节为单位的数据块,记作D1,D2…,Di,最后的数据块可能是1-8字节;
3、   如果最后的数据块长度不足8个字节,则在其后加上十六进制数‘80’和若干个‘0’,直到满足长度为8个字节;如果最后的数据块长度刚好8个字节,则在其后加上十六进制数‘80 00 00 00 00 00 00 00’;
4、   数据块D1作为明文M1,与MAC过程密钥KMA进行DES加密运算,得到密文C1;C1与D2异或后作为明文M2,再与KMA进行DES加密运算;重复以上步骤,直到对Ci-1与Di的异或结果加密完成,得到Ci;
5、   在Ci中,左起取4个字节作为MAC认证码。
当需要保证命令中明文数据的保密性时,则要求对数据进行加密传送。加密的原始数据包括明文的长度(不包含算法要求的填充数据)、明文数据和算法要求的填充数据三大部分。社保卡中使用DES或3DES(当加密密钥长度为16字节时)算法对数据进行加密,加密后的数据作为COS命令的数据域的数据元进行传送。
在某些信息交换过程中,有可能同时使用MAC认证和数据加密手段来保证数据的安全完整性。

四、 操作完整性的保证
保持所操作数据的完整性是社保卡安全的一个重要部分。在某个操作(特别是交易)过程中,可能会由于掉电等原因造成操作突然中断,这时,对卡片操作的结果是不可预料的,对卡内数据的更改可能完成了,也可能只完成了一部分。如果只完成了一部分,就会造成卡内数据不正确、不完整。
社保卡通过检验交易认证码来检验交易是否完成。社保卡在完成交易更新金额之前,必须计算与当前交易数据密切相关的MAC和TAC(交易验证码Transaction Authorization Code)码(帐户划入交易只有TAC码),并保存下来。当金额更新成功后,必须保证通过取交易认证码命令可以获得与交易相应的MAC和TAC码。如果在交易操作结束后未能收到响应,卡片就被拔出,终端可以通过取交易认证码来检查卡内数据是否已经被更新。
防拔机制的引入是为了防止在操作过程中只更新了卡内数据的一部分。如果操作突然中断了,卡片有可能正在执行一个命令,这样会导致命令没有执行完,而命令中需更新的数据也只更新了一部分。要防止这种情况的出现,就需要在每次更新数据前对原数据进行备份,具体实现如下:

unsigned char WriteData ( unsigned char *source, unsigned char *destination, unsigned char length )         // 修改卡内数据的函数
{
        address = destination;    // 要修改数据的目的地址
        BakeupBuffer[Distance+0] = destination / 256; // 目的地址的高位字节
        BakeupBuffer[Distance+1] = destination % 256;         // 目的地址的低位字节
        BakeupBuffer[Distance+2] = length;    // 修改数据的长度
        memcpy ( BakeupBuffer+Distance+3, destination, length );          // 把原来EEPROM中的数据存入缓冲区
        if( WriteEEPROM ( BakeupBuffer + Distance, OldBakeup + Distance, length+3 ) != 0 )
                return ERROR;        // 把原来的数据写入EEPROM中的备份区,以防丢失
        else
        {
                memcpy(BakeupBuffer+Distance+3, source, length);    // 把要写入的数据存入缓冲区,等命令处理后再写到EEPROM
                Distance = Distance + length + 3;        // 计算偏移量
                BakeupBuffer[0] = BakeupBuffer[0] + 1;    // 计算要修改数据的次数
        }
}
在确认命令处理过程正确完成后,把要写入的数据写到相应的EEPROM地址,卡片丢弃备份数据。如果出现异常情况,则在卡片重新上电后,卡片检测BakeupBuffer[0],如果不为0,则需要把OldBakeup缓冲区中的数据恢复到相应的位置,以保证数据的完整性和正确性。

结束语
在越来越重视信息化管理的今天,方便、安全的社保卡将会得到更广泛的应用。社保卡所采取的一系列安全保障措施,是社保卡得以在更大范围内推广应用的坚强基石。如果这些安全手段与接口终端以及应用系统的安全措施相结合,就能更好地防范对卡片的非法操作,更好地保护社保数据的安全。


参考文献:
1、《社会保障(个人)卡规范》,劳动和社会保障部
2、《应用密码学》,Bruce Schneier,机械工业出版社
3、《IC卡的技术与应用》,王卓人,邓晋钧,刘宗祥,电子工业出版社
4、《智能卡技术》,王爱英,清华大学出版社

From: http://blog.csdn.net/zjsogou/archive/2009/06/28/4304187.aspx
阅读(1027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~