因为暂时还没有设计出一套自己满意的安全体系,所以暂时借鉴了网上的一种安全体系,设计的相当巧妙,大家可以参考。
安全体系从概念上分为四部分:
这四部分的联系可以用一张图来说明,同时这张图也基本阐明了整个安全体系的设计思想,见下图:
下面详细介绍各个部分。
安全状态是指卡在当前所处的一种安全级别。COS的MF和DF分别具有16种不同的安全状态。
COS在卡内部用两个4位寄存器来表示安全状态,每个寄存器的值可以是0至F之间的某一值。两个寄存器如下:
它表示整个卡所处的安全级别。
在以下两种情况下,MF安全寄存器将被复位为0:
1)卡片复位后;
2)当在MF下的核对口令或外部认证命令返回的错误状态为63CX.
应用目录的改变不会影响该寄存器的值。
只有MF下的口令核对或外部认证通过后MF的安全状态寄存器值才发生变化。
它表示当前应用所处的安全级别。
在以下几种情况下,DF安全寄存器将被复位为0:
1)卡片复位后。
2)选择DF后(如选择下级子目录或同级目录等)。
3)当前DF下的核对口令或外部认证命令返回的错误状态为63CX.
只有当前目录下的口令核对或外部认证通过后DF的安全状态寄存器值才发生变化。
若当前目录为MF,则当前目录的DF安全状态寄存器的值等于MF的安全状态寄存器值。
安全属性是指对某个文件/密钥进行某种操作时所必须满足的条件,也就是在进行某种操作时要求安全状态寄存器的值是什么。
安全属性又称访问权限,如下表所示:
表3.1 访问权限
文件类型 |
访问权限 |
MF/DF |
建立/擦除 |
KEY文件 |
增加 |
KEY文件中的密钥 |
使用/更改 |
二进制文件 |
读/写 |
定长记录文件 |
读/写 |
循环文件 |
读/写 |
普通钱包文件 |
读&扣款/存款 |
电子存折/电子钱包文件 |
使用 |
变长记录文件 |
读/写 |
文件访问权限:建立该文件时用一个字节指定。
密钥访问权限:增加密钥时用一个字节指定。
访问权限采用一个区间来严格限制其他非法访问者。假设访问权限值为XY,当前安全状态寄存器的值用V来表示。
1)X=0时,即访问权限为‘0Y’时,表示要求MF的安全状态寄存器的值大于等于Y。
如某文件读的权限为‘05’表示在对该文件进行读之前必须使MF的安全状态寄存器的值大于等于5.
2)访问权限为‘XY’时(X不为0)表示要求当前目录的安全状态寄存器的值大于等于Y且小于等于X.
a.当X>Y且X>Y时,要求 Y≤V≤X。
如某文件写的权限为53,只有当前目录的安全状态寄存器的值为3、4或5时才可对该文件进行写操作。
b.当X=Y时,要求V=X=Y。
c.当X<Y时,表示禁止相应的操作,一般设置为EF。
安全机制是指某种安全状态转移为另一种安全状态所采用的方法和手段。
为改变安全状态寄存器的值,必须通过某个密钥的口令校验或外部认证来实现;在密钥装载时,它的后续状态字(8bit)已经规定好了相应的安全状态,认证通过后,密钥的后续状态字节低4位将被置入安全状态寄存器。
在MF下认证通过后,将同时改变MF和当前目录的安全状态寄存器的值;
在非MF下认证通过后,将只改变当前目录的安全状态寄存器值。
例:设卡中某目录下有一个二进制文件,参数定义如下:
读权限=‘F5’;
写权限=‘FA’;
该目录下有一个口令密钥,口令核对通过之后的后续状态为6;
该目录下有一外部认证密钥,使用权限为F6,外部认证通过之后后续状态为B。
请看下面的操作及当前目录的状态寄存器的变化情况:
卡终端操作 |
方向 |
当前目录安全状态寄存器的值 |
选择 DF |
--> |
0 |
|
<-- |
送返回信息 |
读二进制文件 |
--> |
0 |
|
<-- |
读的权限不满足,不允许读 |
验证口令 |
--> |
6 |
|
<-- |
口令核对正确 |
读二进制文件 |
--> |
6 |
|
<-- |
送出读出的数据 |
写二进制文件 |
--> |
6 |
|
<-- |
写的权限不满足,不允许写 |
外部认证 |
--> |
B |
|
<-- |
外部认证正确 |
写二进制文件 |
--> |
B |
|
<-- |
写成功 |
读二进制文件 |
--> |
B |
|
<-- |
送出读出的数据 |
图3-1 访问权限控制
COS支持Single DES、Triple DES密码算法,密钥长度分别是8和16个字节。DES属于对称算法,加密和解密密钥相同。
Single DES算法是指使用单长度(8字节)密钥K对8字节块的输入数据X1,X2,X3…加密,得到8字节块的输出数据Y1,Y2,Y3…。其中,YI = DES(K)[ XI ]
解密方式如下:
XI = DES-1(K)[ YI ]
3DES算法是指使用双长度(16字节)密钥K=(KL||KR)将8字节明文数据块加密成密文数据块, 如下所示:
Y = DES(KL)[DES-1(KR)[DES(KL[X])]]
解密的方式如下:
X =DES-1 (KL)[DES(KR)[ DES-1 (KL[Y])]]
在建立DES密钥时,若密钥长度为8字节则运算时使用Single DES算法,若密钥长度为16字节则运算时使用Triple DES算法。
运算时使用加密还是解密算法完全由密钥类型决定,如:用于加密的密钥不可用于解密或MAC运算,用于外部认证的密钥也不可用于内部认证。
COS在使用DES算法时使用ECB模式,若数据长度不是8的倍数时在计算过程中自动在数据后补80 00...00使其长度为8的倍数。
原文:http://www.cnblogs.com/songwenlong/p/6411743.html