一种安全的java卡密钥存储方法

文档序号:9767657阅读:684来源:国知局
一种安全的java卡密钥存储方法
【技术领域】
[0001]本发明涉及智能卡技术领域,尤其涉及一种安全的JAVA卡密钥存储方法。
【背景技术】
[0002]JAVA卡技术是通过对JAVA技术的裁剪,使采用JAVA语言编写的程序可以运行在智能卡或者是资源受限设备上的一种技术。目前,JAVA卡技术已经被广泛应用在金融、电信等行业,在JAVA卡上,往往承载着很多有关使用者的机密信息,所以人们也越来越关心JAVA卡本身的安全性。
[0003]在JAVA卡中,为了进行一些运算,往往需要保存一些密钥,密钥是JAVA卡中极为重要的敏感数据,必须要保证其存储的安全性。
[0004]GlobalPlatform是一个全球性的组织,它致力于提供一个通用的安全和卡片管理架构,目前市场上的JAVA卡绝大多数也是基于这一架构的,GlobalPlatform组织制定的一系列规范也逐步成为了智能卡行业公认的标准。
[0005]在GlobalPlatform的规范中,存在一个发行方安全域,负责对卡片的管理,同时提供安全、通信等需求的支持,发行方安全域是安装在卡片上的第一个应用,它直接继承了卡片的生命周期状态,在卡片进入0P_READY生命周期状态时,必须已经具备了发行方安全域,并且发行方安全域中必须已经具有了安全通道初始密钥。
[0006]在随后的卡片运行过程中,要想向发行方安全域中增加安全通道密钥,必须通过PUT KEY命令完成。
[0007]除发行方安全域以外的其他安全域如果想具有自己的安全通道密钥,也必须通过PUT KEY命令来完成。
[0008]如果其他安全域还需要具有一些与自身权限相关的密钥,也可以通过HJT KEY命令写入。
[0009]PUT KEY命令是GlobalPlatform的规范中定义的一个标准的命令,该命令可以用来:
[0010]1.添加新的密钥;
[0011]2.使用新密钥替换旧密钥。
[0012]当替换密钥时,新的密钥将与已经存在卡上密钥具有相同的格式,也就是说,不能改变已存在密钥所占空间的大小和加密算法。
[0013]当使用这个命令加载和替换对称密钥时,密钥的值将被加密,用于加密密钥值的密钥是当前安全通道会话中的S-DEK会话密钥。
[0014]当使用这个命令加载公钥时,公钥使用明文的方式表示。
[0015]在GlobalPlatform的规范中,未定义将密钥读出的命令,也就是说,在该规范中,密钥值是不允许被读出的,但是仅通过这种方式保证密钥值不被泄露显然是不够的,必须要从多方面保证密钥不被卡外的攻击者获取。
[0016]常见的密钥在卡内的存储方式可以是以数组方式存储,也可以是以密钥对象的方式存储,以数组的方式存储显然是最不安全的存储方式,如果采用这种方式存储,则卡片的安全性只能通过GlobalPlatform的规范中不允许读取密钥这一点来保证,但攻击者很有可能通过暴力破解或者逻辑攻击等方式得到密钥值。
[0017]采用密钥对象的方式存储,显然比数组方式更加安全,它将密钥值存放在密钥对象中,用户不能直接访问到密钥的实际值,在卡内密钥也是以密钥对象的形式传输的,提高了封装性,但是由于密钥值是通过PUT KEY的命令传到卡上的,并且命令中的密钥值是已经被加密过的,要将其存放到密钥对象中,只能先解密密钥值,再使用密钥值设置密钥对象的操作,在这些操作中,密钥值很有可能通过命令的数组被泄露。

【发明内容】

[0018]本发明实施例提供了一种安全的JAVA卡中密钥存储方法,用以提高密钥存储时的封装性和安全性,并节省密钥使用时的时间。
[0019]本发明提供了一种安全的JAVA卡中密钥存储方法,包括:
[0020]步骤一:在卡片初始化时,发行方安全域的安全通道初始密钥的密钥值通过初始化脚本写入卡内,其中发行方安全域的安全通道初始密钥中的ENC密钥和MAC密钥的密钥值是使用DEK密钥进行加密后的密文值,DEK密钥采用明文方式存储;
[0021]步骤二:创建发行方安全域的实例,同时创建发行方安全域的安全通道初始密钥对象:ENC密钥、MAC密钥和DEK密钥,将这三个密钥都创建为KeyEncrypt1n接口类型;
[0022]步骤三:使用初始化脚本中写入卡内的ENC密钥和MAC密钥的密文值设置发行方安全域的安全通道初始密钥中的ENC密钥和MAC密钥,同时因为这两个密钥是KeyEncrypt1n接口类型的,在设置密钥值之前,要先使用DEK密钥设置ENC密钥和MAC密钥的密钥加密对象(keyCipher),说明ENC密钥和MAC密钥是使用DEK(Data Encrypt1nKey)密钥进行加密的;
[0023]步骤四:将发行方安全域的安全通道初始密钥中的DEK密钥使用它本身进行加密,并存储在KeyEncrypt1n接口类型的密钥对象中;
[0024]步骤五:在使用PUT KEY命令向卡片存储安全域的安全通道密钥时,密钥是使用当前安全通道的会话密钥S-DEK密钥被加密的,保持密钥的加密状态,直接将命令中的加密后的ENC密钥、MAC密钥和DEK密钥分别存储到三个KeyEncrypt1n接口类型的密钥对象中;
[0025]步骤六:在使用HJT KEY命令向卡片存储公钥时,命令中的公钥是以明文方式存在的,直接将其存储到公钥对象中。
[0026]本发明实施例提供的JAVA卡中密钥存储的方法,可以保证无论是发行方安全域的安全通道初始密钥、发行方安全域的其他安全通道密钥还是其他安全域的安全通道密钥都是采用相同的方式存储的,可以保证在存储方式上的一致性,另外,在存储的过程中,不需要显式的对密钥值进行解密,减少了在解密过程中密钥被泄露的风险,对密钥值解密的操作由底层的加密库来完成,避免上层用户直接接触到密钥值。本实施例中还提供了对公钥的存储方式,这种方式可以提高卡片的执行效率。
【附图说明】
[0027]图1为本发明实施例的实施方案流程图;
【具体实施方式】
[0028]下面结合附图和实施例对本发明提供的JAVA卡密钥存储方法进行更详细地说明。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0029]本发明实施例中提供的JAVA卡密钥存储方法,如图1所示,该方法步骤包括:
[0030]SlOl、卡片初始化时写入发行方安全域的安全通道初始密钥;
[0031]S102、创建发行方安全域的安全通道初始密钥对象;
[0032]S103、使用加密的ENC密钥和MAC密钥设置发行方安全域的安全通道初始密钥中的 ENC (Encrypt1n)密钥和 MAC (Message Authenticat1n
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1