随着网络应用的日益开展,网络信息安全也越来越受人们的重视。智能密码钥匙是一种带有微处理器的小型硬件设备,由USB接口和主机建立连接。智能密码钥匙的处理器一般用安全设计芯片,用其内置的安全机制,达到密钥生成、密钥安全存储与预置加密算法等功能,和密钥有关的运算全部在认证设备内部进行。由于智能密码钥匙有密钥无法离开设备的特性,安全性相对高,在网上银行等安全级别要求相对高的应用中普遍使用。然而,智能密码钥匙再说只是一种连接于主机的外围设备,无法避免有一定局限性。智能密码钥匙能提高密钥存储的安全性,但实际应用中仅使密钥存储安全是不够的。智能密码钥匙的应用流程有安全漏洞,存在受攻击者利用的机会,从而对应用安全造成威胁。
当前的智能密码钥匙普遍遵循PKCS#11规范,大多数智能密码钥匙的操作权限控制用PIN码验证机制。只需PIN码通过验证,就可用智能密码钥匙中存储的密钥运算。目前多数智能密码钥匙用的是静态PIN码,而基于静态密码的验证机制早被证明是相当脆弱的,由于当前多数智能密码钥匙本身并没有字符输入功能,PIN码往往需用户通过主机输入,再发送给智能密码钥匙验证。而用键盘钩子等技术窃取用户在主机输入的密码,这已是较成熟的攻击手段。当用户由主机输入PIN码时,攻击者有可能容易地窃取PIN码,从而得到智能密码钥匙的使用权限。由此可知,智能密码钥匙能保证密钥的存储是安全的,却很难保证密钥的使用也安全。用户身份验证流程易被攻击,这是普通的智能密码钥匙很难解决的问题。
为了解决这个问题,提出了自带输入装置的智能密码钥匙。例如,有指纹认证功能的智能密码钥匙,带有指纹传感器,用户由在指纹传感器扫描指纹来身份认证。整个认证过程都由智能密码钥匙自行完成,无须通过主机输入数据,能有效地防范攻击者在主机端对智能密码钥匙身份认证流程的攻击。
然而,只解决这个问题还不够,智能密码钥匙的应用流程仍有安全漏洞。
智能密码钥匙与主机间是由USB协议通信的,USB协议之上的应用层发的数据对智能密码钥匙来说是透明的。尽管智能密码钥匙能支持现行的智能卡类设备规范ISO 7816定义的加密传输与消息验证机制,但这也仅能保证主机USB驱动与智能密码钥匙之间通信时的数据机密性与完整性。USB驱动在主机端的底层,上层的应用数据对USB驱动而言同样是透明的。而且,为提高智能密码钥匙的易用性,有些智能密码钥匙不用私有驱动,而是用计算机预装的通用USB类设备驱动,如HID、SCSI等。在如此条件下,数据传进智能密码钥匙前,主机端未校验;数据传入智能密码钥匙后,智能密码钥匙也未校验。如果在主机端数据被篡改,错误的数据会被作正常的数据传进智能密码钥匙完成操作。则攻击者可把被篡改的数据传进智能密码钥匙操作,给伪造的数据生成合法的签名,因而可冒用合法用户的智能密码钥匙但不被发现。而用尾巴病毒等技术篡改应用数据也是相对成熟的攻击手段。由此可知,智能密码钥匙可以确保操作的安全性,却很难保证待操作数据的安全性。传入的应用数据易受攻击,这同样是普通智能密码钥匙不能解决的问题。
为解决以上问题,在已有的智能密码钥匙应用流程中加入交互环节,在实施敏感操作或向敏感数据实施操作时,提醒用户和智能密码钥匙直接交互,因此防止被冒用但未被察觉。这即为交互型智能密码钥匙的基本思想。
对于智能密码钥匙,用私钥进行的RSA运算通常分为签名与解密操作两种。签名操作先把需要签名的数据传入,用内置的散列算法计算数字摘要,再用私钥对数字摘要进行RSA运算,得到最终的签名结果。而解密操作直接将需要解密的数据传入,利用私钥进行RSA运算。可以想象,如果攻击者自行计算数字摘要,再将数字摘要直接传入进行解密操作,就相当于进行签名操作。因数字摘要由单向变换计算而来,交互型智能密码钥匙无法检查传入的数字摘要是否对应着敏感数据。尽管交互型智能密码钥匙被设计为遵循PKCS#1规范,如果待解密的数据格式不符合PKCS#1标准就不进行运算,但攻击者完全可将自行计算的数字摘要组装为符合PKCS#1标准的格式。只需攻击者得到了操作权限,就可以绕过检验机制,在不惊扰合法用户的前提下给伪造的敏感数据制造合法的签名。这无疑是一个安全漏洞。