随着银行卡的普及,密码键盘的使用频率越来越高,同时密码键盘也遭到各种攻击如通过窃听、流量分析的方法窃取密码键盘的敏感信息;通过恶意篡改、插入、删除、重放破坏设备通信的完整性,这些攻击都严重威胁到了银行和卡用户的信息安全。因此密码键盘的高安全性对银行及卡用户都至关重要,本文对密码键盘安全认证、加密原理等进行了详细的阐述。
在2000 Year前,大部分采用的是明文键盘,所有的密码数据都是明文传送至工控主板进行加密的,明文数据传输过程不安全且工控主板容易被攻破使得密码的安全性大大降低。随着技术的发展,由美国国家标准局制定的DES加密应用到了密码键盘上,此时密码键盘才真正拥有了加密功能。DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977Year被美国联邦政府的国家标准局确定为联邦信息处理标准(FIPS),随后在国际上广泛流传开来才用到密码键盘上,因此也称之为“国际算法”。
支付卡行业 (PCI) 安全标准对密码键盘有了明确标准,PCI全称Payment Card Industry认证,是目前全球最严格、级别最高的金融机具安全认证标准。在此之前,该标准为VISA认证,2006Year,世界5大支付机构(American Express, Discover Financial Services, JCB International, MasterCard Worldwide, and Visa Inc)联名成立了PCI 安委会,主要负责数据安全标准、支付应用数据安全标准及密码传输安全标准的制定等工作。
PCI认证从金融机具的物理安全性、逻辑安全性、联机安全性、脱机安全性、生产期间的设备安全管理、初始密钥注入前的设备安全管理等六个方面进行严格细致的检测,保证支付卡的设备安全。
PCI认证分PCI 1.X(1.0/1.1/1.2);PCI认证分PCI 1.X(1.0/1.1/1.2);PCI 2.X(2.1)(多了移机自毁功能); PCI3.X (3.0/3.1);PCI4.X (4.0/4.1)(4.1为目前PCI委员会公布的最高认证标准)。
通过认证的产品PCI SSC会给它出具一份通过了PCI认证证书,并且会把通过了PCI认证的相关厂家产品名单公布在PCI SSC官网上,可在其官网进行查证。
中国银联参照其标准,于是又有了我国的PIN(Personal Identification Number)输入设备安全要求,PIN是指个人标识码,在金融行业,一般就是指个人密码。目前国际通用的加密算法有DES,TDES,AES,RSA,ECC等,中国为了国家安全,推出了自己的国密算法,主要是SM2,SM3,SM4算法等等。
目前所用密码键盘主要可分为两类,一、全键盘,可参考证通电子的密码键盘ZT599(下图所示)及ZT938(多功能键盘);二是数字键盘(下图所示ZT598、ZT921),使用的密码键盘多为数字键盘。同时从材质上也分为两大类:金属键盘(图中所示ZT599与ZT598)与非金属键盘(ZT921)。金属密码键盘多用于银行ATM机等自助设备中,键盘一般嵌入设备中使用,通过坚固的金属材质及一系列特制的技术手段来达到防尘、防暴、防钻、防撬、防拆等特性。非金属键盘主要用于POS机等需要输入密码的金融设备上配套使用,处于室内环境,其外部材质要求没有金属密码键盘高。
ZT921.jpg (18.73 KiB) 查看 17 次
ZT921
ZT599.png (141.92 KiB) 查看 17 次
ZT599
ZT598.png (209.81 KiB) 查看 17 次
ZT598
本文以证通电子的金属密码键盘为例来讲述密码键盘的工作原理,先对密钥相关知识进行简要介绍。
密钥:密钥的本质是一种算法参数,它是在将明文数据转换成密文数据或将密文数据转换成明文数据的算法过程中的一个处理参数。
明文:指在加/解密过程中,没有经过处理的原始数据。
密文:指原始数据经过特殊处理之后,得到的一种与原始数据对应的新数据。
加密:指将明文数据转换成为密文数据的过程。
解密:指将密文数据转换成为明文数据的过程。
根密钥:用于处理主密钥的密钥。根密钥只能是通过专用密钥POS下载。
密钥POS:俗称母POS,用于存储、传输密钥的一种专用设备。
PinBlock:卡号与密码经预处理后进行异或,通过DES加密后的密文数据块一般称为PinBlock。
密钥的下载可分为工作密钥和主密钥的下载。工作密钥是用于处理用户数据、交易数据的密钥的总称。工作密钥一般是通过签到交易、密钥更新交易获得,然后保存在设备中。主密钥是用于处理工作密钥的密钥。主密钥一般有2种获取方式:通过专用的密钥POS直接下载到密码设备中;通过签到交易、密钥更新交易获得,由根密钥进行处理。工作密钥用来加密PIN或其他敏感信息,主密钥用来加解密工作密钥,提高工作密钥的安全性。密码键盘中有多组工作密钥及主密钥,主密钥及工作密钥在下载时都有对应的密钥索引号,一对工作密钥与主密钥使用相同索引号。
对称密钥与非对称密钥。对称密钥是指加密与解密使用的密钥是一致的,它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难。非对称密钥是指加解密使用的是不同的密钥一般称为公钥和私钥,公钥是公开的,私钥是个人持有的,具有安全性高但加解密速度慢的特点。对于非对称密钥,一般是公钥加密、私钥解密,私钥数字签名、公钥验证。关于数字签名在ISO7498—2标准中定义为:“附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据和变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造”。
发送方用接收方的公钥对报文进行加密,然后再用自己的私钥完成数字签名,将数字签名和报文传送给接收方。接收方在收到密文和数字签名后,先用发送方提供的公钥进行验签,然后再用自己的私钥对密文进行解密,得到明文,确保发送方身份的准确性,以及报文并没有被篡改过。验签过程是:接收方首先用发方公钥解密数字签名,导出报文摘要,并对电子文件原文作同样哈希算法得一个新的报文摘要,将两个摘要的哈希值进行结果比较,结果相同签名得到验证,否则签名无效。这就是《电子签名法》中所要求的对签名不能改动,对签署的内容和形式也不能改动的要求。
密码键盘的工作状态,其状态可分为出厂初始化,授权认证,密钥装载,正常工作和自毁状态。
出厂初始化:使用专用的安全密钥初始化工具对密码键盘进行密钥初始化。主要操作为使用专业设备调用密码键盘生成两对密钥对,将公钥导出,并使用厂商私钥对导出的公钥对进行签名,将公钥和签名数据导入密码键盘,密码键盘使用厂商公钥进行验签,验签成功后保存公钥的签名,验签失败将密钥对进行删除。
密钥装载:包括通过密钥协商装载初始主密钥,密文装载密文主密钥和工作密钥。为了保证产品密钥的安全,银行会对存储在产品中的密文主密钥或工作密钥进行定期更新。
授权认证:访问密码键盘的敏感信息和敏感服务都需要进行授权认证,通过授权管理员验证各自密码完成授权认证,主要是为了防止用户非法访问密码键盘敏感数据和敏感服务。
正常工作:完成密钥装载和授权认证后,产品进入正常工作状态,可以完成PIN 输入和PIN 加密功能。
自毁状态:密码键盘授权安装后,就不能被非法移除。如果产品检测到恶意攻击,包括暴力拆卸获取敏感信息、非法移除等,产品将清除内部所有敏感信息,停止正常工作,进入自毁状态。
接下来介绍密码键盘的使用流程,本文使用证通电子TAF平台的密码键盘的使用为例,密码键盘的工作流程如下图所示。
在TAF平台中打开密码键盘对应的API为Pinpad.ZTOpen(加参数)。
密钥下载对应API为Pinpad_DownloadKeyBegin(type),可下载工作密钥及主密钥。为了防止密钥被非法使用,密钥在下载或前需确认主机身份的合法性,确保一台主机对应一台密码键盘。密钥认证的过程,实际是使用认证密钥实现主机和密码键盘之间基于随机数的双向身份认证。
密码键盘通过扫描获取按键的值,按键的数字一般不通过上层软件,直接进入硬件处理,等到按键按完成后,硬件直接把经过处理的按键信息给上层软件,此时已经是密文了,将计算PinBlock的处理移到硬件里面去了,这种处理就被称为硬加密,能够进一步提高密码键盘中数据传输的安全性。
密钥键盘一般的运算包括DES加解密、MAC计算,DES加解密主是对敏感信息进行加解密,确保数据的安全;MAC计算主要是对报文进行处理,保证数据包在网络传输过程中数据不会被有意或无意的篡改,通过报文校验来确定报文是否被修改,提高数据传输过程中的安全性。在该平台中密码键盘的接口execPinpad(CmdCode.DAM_CMD_PIN_XX_XX , send)是密码键盘进行数据处理的函数接口,数据的输入、DES加解密、mac计算等,接口原型及参数如下表所示:
[接口原型 int ZTExec(int p_iCommand, QString p_sCmdData, int p_iIndex=0)
功能 执行命令
返回值 >=0 接收命令成功
< 0 接收命令失败
参数 输入\输出 类型 说明
p_iCommand input int 命令ID 如OPEN、以CLOSE等
p_sCmdData input QString 命令数据,JASON格式
p_iIndex input int 命令序列号,保留]
设备关闭所用API为Pinpad_close()。
密码键盘调用方法,TAF平台下JS调用密码键盘的部分功能代码。
//密码键盘操作函数
代码: 全选
function execPinpad(icmd, data)
{
Pinpad.ZTExec(icmd,data,0,function(ret){}); //ZTTAF平台对应的
//密码键盘操作接口
}
//打开设备
代码: 全选
function openPinpad()
{
try{
output(1, "打开设备");
Pinpad.ZTOpen(CmdCode.WFS_OPEN, 0, function(ret){});
}catch(err){
tips("js错误:"+ err);
}
}
//下载密钥 type:1表示主密钥,2表示工作密钥
function Pinpad_DownloadKey(type)
{
if(1 == type)
{
console.log("进入下载主密钥");
//$('WorkKeyId1').style = "none";
$('WorkKeyId1').attr("readonly","readonly");
$('#DownLoadKeyLabel').text('下载主密钥');
$('#DownLoadKeyLabel').attr('onclick', 'Pinpad_DownloadKeyBegin(1);'); //将主密钥下载到对应索引号地址
}
else
{
//$('#WorkKeyId1').style = "block";
$('#DownLoadKeyLabel').text('下载工作密钥');
$('#DownLoadKeyLabel').attr('onclick', 'Pinpad_DownloadKeyBegin(2);');
}
ShowDlg('DownLoadDlg');
}
//密钥下载入口
function Pinpad_DownloadKeyBegin(type)
{
try{
$('#dlg').dialog('close');
var sCmdData = {};
sCmdData.MK = $('#dlg #MainKeyId1').val();
sCmdData.WK = $('#dlg #WorkKeyId1').val();
sCmdData.KEYVALUE = $('#dlg #KeyValue1').val();
sCmdData.KVCVALUE = $('#dlg #KVCValue1').val();
var send = JSON.stringify(sCmdData);
if(type == 1)
output(1,"下载主密钥");
else
output(1,"下载工作密钥");
output(0,send);
execPinpad(CmdCode.DAM_CMD_PIN_LOAD_KEY, send);
}catch(err){
tips("js错误:"+ err);
}
}
//明文输入
代码: 全选
function PinpadGetKey(){
try{
$('#dlg').dialog('close');
var sCmdData = {};
sCmdData.MAXLEN = $('#dlg #keyLength').val();
sCmdData.AUTOEND = $('#dlg #endOuto').val();
var send = JSON.stringify(sCmdData);
output(1,"明文输入");
output(0,send);
execPinpad(CmdCode.DAM_CMD_PIN_GET_DATA, send);
}catch(err){
tips("js错误:"+ err);
}
}
//密文输入 MINLEN、 MAXLEN输入长度的最小值与最大值
代码: 全选
function PinpadGetPin(){
try{
$('#dlg').dialog('close');
var sCmdData = {};
sCmdData.MINLEN = $('#dlg #pinMinLength').val(); sCmdData.MAXLEN = $('#dlg #pinMaxLength').val();
sCmdData.AUTOEND = $('#dlg #pinEndOuto').val();
var send = JSON.stringify(sCmdData);
output(1,"密文输入");
output(0,send);
execPinpad(CmdCode.DAM_CMD_PIN_GET_PIN , send);
}catch(err){
tips("js错误:"+ err);
}
}
//获取PinBlock
代码: 全选
function Pinpad_getPinBlock(){
try{
$('#dlg').dialog('close');
var sCmdData = {};
sCmdData.MK = $('#dlg #mainKeyNo').val();
sCmdData.WK = $('#dlg #workKeyNo').val();
sCmdData.CardNo = $('#dlg #cardNo').val();
sCmdData.KeyFormat = $('#dlg #pswFormat').val();
var send = JSON.stringify(sCmdData);
output(1,"获取PinBlock");
output(0,send);
execPinpad(CmdCode.DAM_CMD_PIN_GET_PINBLOCK , send);
}catch(err){
tips("js错误:"+ err);
}
}
//des加密 被加密的数据一般是个人密码等敏感信息
代码: 全选
function Pinpad_desAddPin(){
try{
$('#dlg').dialog('close');
var sCmdData = {};
sCmdData.MK = $('#dlg #mainKeyNo1').val(); //取主密钥
sCmdData.WK = $('#dlg #workKeyNo1').val(); //取工作密钥
sCmdData.TYPE = "1";
sCmdData.DATA = $('#dlg #data1').val(); //被操作数据
sCmdData.MODE = $('#dlg #addPinWay1').val();//加密模式
var send = JSON.stringify(sCmdData);
output(1,"des加密");
output(0,send);
execPinpad(CmdCode.DAM_CMD_PIN_CRYPT , send);
}catch(err){
tips("js错误:"+ err);
}
}
//des解密
代码: 全选
function Pinpad_desOut(){
try{
$('#dlg').dialog('close');
var sCmdData = {};
sCmdData.MK = $('#dlg #mainKeyNo2').val();
sCmdData.WK = $('#dlg #workKeyNo2').val();
sCmdData.TYPE = "0";
sCmdData.DATA = $('#dlg #data2').val();
sCmdData.MODE = $('#dlg #addPinWay2').val();
var send = JSON.stringify(sCmdData);
output(1,"des解密");
output(0,send);
execPinpad(CmdCode.DAM_CMD_PIN_CRYPT , send);
}catch(err){
tips("js错误:"+ err);
}
}
//MAC计算
代码: 全选
function Pinpad_calculateMAC(){
try{
$('#dlg').dialog('close');
var sCmdData = {};
sCmdData.MK = $('#dlg #mainKeyNo3').val(); //取主密钥
sCmdData.WK = $('#dlg #workKeyNo3').val(); //取工作密钥
sCmdData.DATA = $('#dlg #data3').val(); //被操作数据
sCmdData.MODE = $('#dlg #macWay').val(); //模式
var send = JSON.stringify(sCmdData);
output(1,"MAC计算");
output(0,send);
execPinpad(CmdCode.DAM_CMD_PIN_MAC , send);
}catch(err){
tips("js错误:"+ err);
}
}
//关闭设备
代码: 全选
function Pinpad_close(){
try{
output(1,"关闭设备");
Pinpad.ZTClose(CmdCode.WFS_CLOSE, 0);
}catch(err){
tips("js错误:"+ err);
}