本文针对PKCS# 11和CSP进行学习,以及基于CSP的USBKey密码符合性检测平台的模块设计。
开发商按照标准开发 CSP,就可以把自己开发的软件或硬件密码模块无缝连接到 CryptoAPI 的体系中。
CSP:
CSP的开发目的在于开发符合CryptoSPI要求的接口函数,并且把硬件实现或者软件实现的密码运算功能按照CryptoAPI所能够识别和使用的方式进行封装。
对于CSP而言,应用程序与CSP的交互首先通过CryptoAPI函数接口进行接口调用,然后通过对CryptoSPI(Cryptographic System Programming Interface)将CryptoAPI接口进行的操作传递给CSP。CSP随后则可进行相关处理,完成应用程序所要求的密码操作。
CSP需要USB Key厂商提供CSP接口程序。
PKCS# 11:
PC/SC中的PKCS#11作为密码令牌接口开放标准,它为拥有密码信息(密钥或证书)和执行密码学函数的用户设备定义了一个应用程序接口,将设备的细节抽象化,并把密码设备的通用模型——密码令牌,简称令牌,提供给应用程序。
主要术语和概念:
(文字以及图片内容从《PKCS_11密码令牌接口标准技术综述》、《一种基于Cryptoki应用程序接口的安全应用方案》、《基于USBKEY的CSP与PKCS_11互通的实现方法》和《两种密码中间件模块PKCS_11与CSP的对比分析》等相关论文中选择性的整理而来,以便日后参考)
Cryptoki是一种应用程序与各种密码设备(基于智能卡、PCMCIA卡以及智能软盘)间的一种接口。该接口提供与设备细节无关的密码令牌给应用程序使用。
Cryptoki 采用槽、令牌、用户、会话、类、对象、机制、属性、模板、会话句柄、对象句柄、功能函数等概念来抽象对密码设备的操作过程。
一个令牌的Cryptoki的逻辑视图是一个能存储对象、执行密码功能的设备;会话抽象为应用到设备的连接;对象是属性的集合。
对象可根据生命周期分为:会话对象和令牌对象;属性描述了对象的特征;模板就是一个属性数组;应用打开一个会话时,Cryptoki以会话句柄方式标识会话,便于应用使用会话句柄访问会话,同时应用可通过调用Cryptoki接口创建或查询对象,而Cryptoki以对象句柄方式标识对象,便于会话通过对象句柄访问对象;
Cryptoki 定义了四类存储对象:数据对象、证书对象、密钥对象、密码算法域参数对象。
密钥可以是一个公钥或一个私钥或一个保密密钥或为一个OTP密钥。这几类密钥都有用在特别机制中的子类型。一个机制作为一个对象明确指定了一个密码处理是怎样被执行的。
Cryptoki中定义的机制被不同的密码操作支持。对于一个特定的令牌,一个特定的操作只支持Cryptoki中定义的机制集合的一个子集。
对象的类型主要有五种:数据、证书、公钥、私钥和秘密密钥。比如,CK_OBJE CT_CL ASS是标识Cryptoki识别的那些对象类别(或类型)的一个。
对象按访问方式分为Public对象和Private对象。对Public对象进行操作不需要登录到TOKE N ,而对Public对象的操作需要先用PIN 码登录到TOKE N 。管理员仅能对Public对象进行操作,而普通用户可对所有对象进行操作。
对象按使用期限和可见性可以分为TOKEN(令牌)对象和SESSION(会话)对象。TOKEN对象对所有的应用程序可见,并且一直保存在TOKEN中,即使在会话关闭或令牌从槽中拔出后。SESSION对象则是暂时的,当会话关闭时,该会话产生的所有会话对象就会自动被破坏,只有产生会话对象的应用程序能够查看它们。
Cryptoki对创建对象时那些属性必须指定那些可选都有明确的规定,并且明确了属性之间的一致性定义。在对象拷贝时,能否修改对象的属性依赖于确定对象的属性值,如一个保密密钥对象在使用C_CopyObject进行对象拷贝时其CKA_SENSITIVE 属性的值可以由 CK_FALSE 改变为 CK_TRUE,而不能由 CK_TRUE 改变到 CK_FALSE。
Cryptoki中的用户Cryptoki识别三种用户类型:安全官(Security Officer(SO))、正规用户(normal user(NU))、上下文特定用户(contextspecific user(CSU))。只有NU在通过认证之后才能准许访问令牌上的私有对象。可能有些令牌在执行任何密码操作之前还要求用户证实身份,而不管密码操作是否涉及私有对象。
SO 的角色是初始化一个令牌,并设置 NU 的 PIN(或者定义其他方式来对 NU 进行认证),或许还要操纵一些公用对象。NU 在 SO 没有为其设置 PIN 之前是不能登录令牌的。事实上SO 和 NU 可以是一个人,这可根据密码令牌的管理策略来确定。CSU 只有在重新认证密码操作时才会用到。
/**********
CSP和PKCS#11的兼容性
主要区别:
1、Cryptoki 使每个密码设备从逻辑上看与其它设备无异,因此应用不需要直接对设备驱动的接口,Cryptoki 把这些细节隐藏了。
2、PKCS#11 主要在 Unix、Linux 平台上,是一个开放的标准。CSP 主要用在 Windows 平台上和各种应用。
3、CSP需要USB Key厂商提供CSP接口程序。
CSP调用PKCS:
(1) 在 PKCS#11 的基础上再实现 CSP ,即 CSP 调用 P K C S # 1 1 。
(2) 做一个中间层,PKCS#11和 CSP 看到 Key 里面的东西是一样的。
(3) 在Key内约定同一个管理文件,共同维护该管理文件,但PKCS#11 需要维护额外的内容,而这部分内容对 CSP 是不透明的。
注:
本来是想考虑通过CSP调用PKCS#11的可操作性如何,不过似乎比较复杂而且多余,因此仅列在这里作为日后其他扩展开发的参考。
***********/