POS逻辑安全说明

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、公钥证书格式

表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、私钥证书格式

表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所示          

表3 DRY_SKR寄存器值

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();  //机器重启	
}


发布了18 篇原创文章 · 获赞 0 · 访问量 532

猜你喜欢

转载自blog.csdn.net/qq_17639223/article/details/104375034