1. 逻辑安全概述
mPOS终端产品采用兆讯恒达微电子技术MH1902安全芯片,终端逻辑安全功能主要由安全CPU来完成。
2. 物理安全模块说明
1)该芯片包括以下安全模块
1、硬件DES\RSA\国密加密算法;
2、环境监测模式;
3、触发检测模块;
4、随机数发生器。
2)触发检测模块
触发检测模块主要用来检测系统是否被攻击,能检测电压、温度、及四个外部触发状态检测脚,一旦检测到系统被攻击,
所有存放在电池保护区的数据会被清除。
3)随机数发生器
随机数发生器,采用 CPU的随机数发生器,CPU随机数发生器用来生成程序所需的随机数。在生成随机数的时候加上一些
其他的随机因子,日期时间 、定时器地址及剩余时间值、随机因子,并且生成的随机数使用3DES算法处理过后再作为输
入因子,使得随机数发生器生成的数据更加随机。
4)软件逻辑安全处理措施
除了安全芯片提供的物理安全保护模块,在软件逻辑上,mPOS终端使用多种安全方案来保证敏感数据的安全,防止数据
被篡改。
1、使用安全CPU的 boot校验机制控制boot的下载;
2、采用RSA2048、SHA-256算法来保证升级及运行固件程序的的合法性和完整性;
3、采用RSA2048算法来传输下载密钥过程中使用到的加密密钥和认证密钥;
4、使用随机数发生器生成MMK、ELRCK,使用NV SRAM区保存 MMK、ELRCK来对存放在机器中的密钥进行加密和
认证,系统受到攻击后MMK、ELRCK丢失,同时密钥也就丢失;
5、机器如果3分钟没有操作的话,在不带外电的情况下会自动关机,每次上电时对所有密钥进行一次检查,检查密钥是否
被篡改;
6、每隔24小时重启对固件程序进行完整性、合法性检查,同时对所有密钥进行一次检查;
7、读取密钥时对密钥进行实时检查, 防止使用时密钥已被篡改。
3. 安全CPU文件签名格式
1)RSA证书格式
1、公钥证书格式
版本 |
ASC |
8B |
PK 1 |
公钥,不足后面补0 |
签发者 |
ASC |
16B |
TRENDIT |
不足后面补0 |
序列号 |
ASC |
32B |
1234567890 |
不足后面补0 |
签名算法标识 |
ASC |
8B |
RSA |
不足后面补0 |
有效期 |
BCD |
8B |
2010010120110101 |
不足后面补0 |
公钥信息 |
HEX |
164B |
|
包含有随机数(2048位) |
备用 |
HEX |
720B |
0 |
|
CA的数字签名明文 |
HEX |
20B |
|
|
CA的数字签名密文 |
HEX |
24B |
|
发证书时填充0 |
2、私钥证书格式
版本 |
ASC |
8B |
SK1 |
私钥,不足后面补0 |
签发者 |
ASC |
16B |
TRENDIT |
不足后面补0 |
序列号 |
ASC |
32B |
1234567890 |
不足后面补0 |
签名算法标识 |
ASC |
8B |
RSA |
不足后面补0 |
有效期 |
BCD |
8B |
2010010120110101 |
不足后面补0 |
私钥信息 |
HEX |
580B |
|
包含有随机数(2048位) |
备用 |
HEX |
2104B |
0 |
|
CA的数字签名明文 |
HEX |
20B |
|
|
CA的数字签名密文 |
HEX |
24B |
|
发证书时填充0 |
4. 安全CPU安全及密钥管理
1)密钥存放
1、MMK 、ELRCK存放在芯片的电池保护寄存器区
密钥加密密钥MMK、ELRCK保存在dryice模块电池保护寄存器DRY_SKR中
2、DRY_SKR:DryIce Security Key Register(DRY_SKR0 to DRY_SKR7)
3、MMK: 对 POS中存放的所有密钥进行加密
ELRCK: 对POS中存放的密钥的校验MAC进行加密
4、DRY_SKR寄存器值对应表3所示
Register |
Data |
Remark |
---|---|---|
DRY_SKR 0,1,2,3, |
MMK |
16bytes |
DRY_SKR4,5,6,7 |
ELRCK |
16bytes |
2)应用密钥存放
1、MK:主密钥
PINK:PIN加密工作密钥
MACK : MAC加密工作密钥
TDK:磁道数据加密工作密钥
FIXEDK: 固定密钥
BPK:下载工作密钥时的认证密钥
2、MK、PINK、MACK、 TDK、FIXEDK、BPK存放的结构体如下所示(每个密钥占用32个字节的空间):
typedef struct _PCIAPPKEY
{
u8 keytype;
u8 keyindex;
u8 keylen;
u8 keydata[24]; //使用MMK对密钥加密后的数据
u8 keylrc[5]; //对上面的信息算校验MAC,然后使用ELRCK加密
}PCIAPPKEY;
以上结构体保存在(组号).key 文件中,如下图1所示。
3)密钥加密存放方法
1、将要保存的密钥的keytype、Keyindex、keylen、keydata填入到结构体中相应的数据段中
tmpappkey.keytype = keytype;
tmpappkey.keyindex = keyindex;
tmpappkey.keylen = keylen;
memset(tmpappkey.keydata,0xff,sizeof(tmpappkey.keydata));
memcpy(tmpappkey.keydata,keydata,keylen);
2、使用MMK对密钥明文使用3DES进行加密
ret = pcikeymanage_keyprocessusingMMK (ENCRYPT,tmpappkey.keydata,24);
if(ret != PCI_PROCESSCMD_SUCCESS)
{
DEBUG("\r\n pcidrv_keyprocess_usingMMK ret = %d \r\n",ret);
return ret;
}
3、计算密钥密文的XOR校验值
k = pcikeymanage_CalculateLRCCheckvalue (tmpappkey.keydata,24);
4、组织密钥信息校验MAC
elrckdata[0] = k;
elrckdata[1] = tmpappkey.keytype;
elrckdata[2] = tmpappkey.keyindex;
elrckdata[3] = tmpappkey.keylen;
elrckdata[4] = 0;
elrckdata[5] = 0;
elrckdata[6] = 0;
elrckdata[7] = 0;
5、使用ELRCK对密钥信息校验MAC进行DES加密
ret = pcikeymanage_keyprocessusingELRCK (elrckdata,8);
if(ret != PCI_PROCESSCMD_SUCCESS)
{
return ret;
}
6、比较已保存的密钥中是否有一样的密钥
ret = pcikeymanage_checkallappkey (groupindex,keytype,keyindex,tmpappkey.keydata);
if(ret != PCI_PROCESSCMD_SUCCESS)
{
return ret;
}
7、将最后的结构体数据保存到密钥文件中
pcikeymanage_saveappkey();
5. 密钥擦除
POS运行过程中,24小时检测运行程序时检查到运行程序被篡改,MMK 、ELRCK校验不正确或保存在SPI FLASH中的密钥被
篡改了,会先清除MMK 、ELRCK,再擦除外部FLASH中的密钥数据。这时候终端被锁,提示"系统安全已触发"。
void pcitamper_manage_selfcheck_securitylocked(u8 type)
{
dev_dryice_writeramdata(); //清除MMK、ELRCK
pcikeymanage_initkeydata(); //清除所有密钥
gPCITamperManage.gTamperCurrentValue = 0xFFFFFFFF;
pcitamper_manage_savetamper(gPCITamperManage.gTamperCurrentValue); //保存触发状态
dev_smc_systemsoftreset(); //机器重启
}