来源:中国一卡通网 作者:朱政洪,张勇 发布时间:2011-11-18 09:13:11 字体:[大 中 小]
摘 要:CSP 是Windows 操作系统加密体系的重要组成部分,智能卡作为一种硬件级加密设备要和Windows 操作系统加密体系无缝连接需要为其开发CSP 加密服务提供者程序。为智能卡开发一个稳定、高效的CSP 是一件复杂的事情,其中如何为CSP 设计一个简洁而又实用的软件架构体系和密钥存贮结构至为重要。该文将探讨这方面的设计思路。
在CSP 的具体设计与实现中,HCRYPTPROV 对象类型、HCRYPTKEY对象类型和HCRYPTHASH 对象类型之间的相互关系如图4 所示。
ProvQueue 链表为CSP 上下文环境句柄链表,KeyQueue 链表为密钥句柄链表,HashQueue 链表为哈希句柄链表。
CProvContext 为CSP 上下文环境类、CCryptKey 为密钥句柄类、CCryptHash 为哈希句柄类,这几个类的具体设计见下文。
4.3.1 CSP 上下文环境对象的实现
CSP 的上下文环境由HCRYPTPROV 对象类型实现,在实现过程中可以定义一个CProvContext 的类,具体定义如下:
该类包含有在当前上下文环境中使用的容器名ContainerName,通过SetProvParam 成员函数可以对当前上下文环境属性进行设置,通过GetProvParam 成员函数可以得到当前上下文环境的属性。将该类强制转换成HCRYPTPROV 类型,即可实现CSP 上下文环境的数据类型。
如果在同一个进程中通过CryptoAPI 的CryptAcquireContext 函数同时打开多个不同的容器,此时就会有多个CProvContext 类实例,因此需要通过链表来管理多个实例。这里定义一个ProvQueue 的链表,在同一个进程中每当打开一个容器或新建一个容器时,就产生一个CProvContext 类的实例,将该实例加入到ProvQueue 链表中,通过prevContext 指针指向前一个实例, 通过nextContext 指针指向后一个实例。
CSP 25 个函数中都有CSP 的上下文环境句柄,25 个函数之间的关系可以通过这个句柄得到联系。比如调用CPEncryt 函数时,首先检查CPEncryt 传入HCRYPTPROV 句柄是否在ProvQueue 中存在,如果存在,则ProvQueue 链表中对应的该条记录即为当前的上下文环境句柄,该记录中包含有当前的容器名、相关的密钥队列(KeyQueue)和哈希队列(HashQueue),从密钥队列(KeyQueue)中可以获取CPEncryt 函数需要使用的密钥对象。对象之间的关系可参见图4。
4.3.2 HCRYPTKEY 密钥对象类型
HCRYPTKEY 密钥对象类型可以定义一个CCryptKey 的类,在使用过程中将该类强制转换成HCRYPTKEY 类型,该类具体定义如下:
该类包含有当前密钥所对应的算法(KeyAlgid)、dwFlags 参数以及当前密钥隶属于的CSP 上下文环境对象(pProContext)。通过SetKeyParam 成员函数可以对当前密钥属性进行设置,通过GetKeyParam 成员函数可以得到当前密钥的属性。
在同一个CSP 上下文环境对象中可以同时产生多个不同的密钥句柄,因此需要通过密钥句柄链表来管理这些密钥句柄。定义一个KeyQueue 的链表,在同一个CSP 上下文环境对象中每当产生一个新的密钥或导入一个新的密钥时,就会产生一个CCryptKey类的实例,将该实例加入到KeyQueue 链表中,通过prevCryptKey 指针指向前一个实例, 通过nextCryptKey 指针指向后一个实例。
通过图4,可以看到密钥与密钥链表之间的关系,具体使用某个密钥时需要先从KeyQueue 链表中找到对应的密钥句柄。比如调用CPEncryt 函数时,先检查CPEncryt 函数传入的HCRYPTKEY 句柄是否在KeyQueue 链表中已经存在,如果存在,则KeyQueue 链表中对应的该条记录即为当前的密钥句柄,该记录中包含有当前密钥的算法(KeyAlgid)、dwFlags 等参数。
4.3.3 HCRYPTHASH 哈希对象类型
HCRYPTHASH 哈希对象类型的定义和HCRYPTKEY 密钥对象类型的定义相似,定义一个CCryptHash 的类,在使用过程中将该类强制转换成HCRYPTHASH 类型,该类具体定义如下:
该类中包含有当前哈希所对应的算法(HashAlgid)、dwFlags 参数以及当前哈希隶属于的CSP 上下文环境对象(pProContext)。通过SetHashParam 成员函数可以对当前哈希属性进行设置,通过GetHashParam 成员函数可以得到当前哈希的属性。
在同一个CSP 上下文环境对象中可以同时产生多个不同的哈希句柄,因此需要通过哈希句柄链表来管理这些哈希句柄。定义一个HashQueue 的链表,在同一CSP 上下文环境中每当产生一个新的哈希时,就会产生一个CCryptHash 类的实例,将该实例加入到HashQueue 链表中,通过prevCryptHash 指针指向前一个实例, 通过nextCryptHash 指针指向后一个实例。
通过图4,可以看到哈希与哈希链表之间的关系,具体使用某个哈希时需要先从HashQueue 链表中找到对应的哈希句柄。比如调用CPHashData 函数时, 先检查CPHashData 函数传入的HCRYPTHASH 句柄是否在HashQueue 链表中已经存在, 如果存在,则HashQueue 链表中对应的该条记录即为当前的哈希句柄,该记录中包含有当前哈希的算法(HashAlgid)、dwFlags 等参数。
5 综述
综上所述,由于微软对于CSP 只是定义了基本的函数接口,具体在CSP 的设计与实现过程中有很强的灵活性,除了本文提到的几种CSP 的设计和实现方法外,可能还会有其它的CSP 设计和实现方法,CSP 中密钥存贮结构的设计方法也有很多。随着智能卡技术的不断发展,以及智能卡在各行各业中应用的普及,各行各业对智能卡CSP 功能上的要求可能会有不同,安全性方面的要求可能也会有差异,因此CSP 软件架构如何设计,对应的密钥存贮结构如何设计,主要还是看CSP 的具体用途 。
推荐文章
论坛热帖