来源:中国一卡通网 作者:朱政洪,张勇 发布时间:2011-11-18 09:13:11 字体:[大 中 小]
摘 要:CSP 是Windows 操作系统加密体系的重要组成部分,智能卡作为一种硬件级加密设备要和Windows 操作系统加密体系无缝连接需要为其开发CSP 加密服务提供者程序。为智能卡开发一个稳定、高效的CSP 是一件复杂的事情,其中如何为CSP 设计一个简洁而又实用的软件架构体系和密钥存贮结构至为重要。该文将探讨这方面的设计思路。
随着智能卡功能的不断完善,卡片运算速度和存贮功能的不断加强,在对安全性要求较高的领域,智能卡的应用开始越来越广泛。其中作为硬件数字证书使用,也是智能卡的一项重要功能。智能卡作为硬件级的加密设备,如何同当前使用最为广泛的windows操作系统进行无缝连接,需要开发智能卡读卡器硬件、读卡器驱动程序、智能卡CSP 等一系列软硬件设施,本文将主要针对其中的智能卡CSP 开发。
1 CSP 简介
加密服务提供者Cryptographic Service Provider(简称CSP)是Windows 操作系统加密体系的重要组成部分,它提供了一组标准API 函数(CryptoAPI)供应用程序调用,如IE 使用SSL 访问网站、Outlook 发送加密邮件等,均会调用到CryptoAPI 函数。智能卡作为一种硬件级的加密设备,要实现和windows 操作系统的无缝连接,使应用程序能够通过CryptoAPI 这套标准函数使用智能卡设备, 就必定要针对该种设备开发CSP 服务程序。智能卡设备CSP 在系统中的位置如图1 所示。
2 CSP 中的容器
CSP 使用容器来管理密钥,以RSA 密钥为例,一个容器中可以存在一对RSA 交换密钥和一对RSA 签名密钥。一个智能卡中可以有多个容器。结构如图2 所示。Windows 系统中一般会存在多个CSP,既有微软自己的纯软件型CSP,也可能有数个不同厂商的软硬件加密设备的CSP。应用程序可以通过CryptoAPI 函数的来指定使用哪个CSP 以及该CSP 中的哪个容器。
3 CSP 在智能卡中的密钥存贮结构
3.1 智能卡中私钥的特点
在CSP 中私钥的作用主要是用来做解密或签名。智能卡这种设备的一个重要特点是私钥可以设定为读禁止,私钥不能被从智能卡中读出。当需要用私钥进行解密或者签名时,被解密或签名的数据必须先送入智能卡,由智能卡中的处理器对数据做解密或签名,解密或签名后的数据再出智能卡返回计算机中。整个过程中私钥不能被计算机读出,解密或签名的过程是在智能卡中进行的,保证了私钥的不可复制特性,避免了黑客攻入计算机,将私钥远程拷贝走的可能。
3.2 私钥、公钥和证书的不同保护级别
使用私钥时,智能卡需要验证保护该私钥的PIN 码,只有PIN 码验证正确的情况下才能使用私钥。但智能卡中的证书和公钥则一般不需要PIN 码保护,以保证使用过程中的灵活性。在CryptoAPI 的SILENT 模式中,公钥可以随时被读出。另外当智能卡插入到连接计算机的读卡器中时,一般都需要将智能卡中的证书导入到windows 系统的证书库中,因IE 浏览器不能直接识别智能卡中的证书,它需要从windows 系统的证书库中去读证书。这些情况下均需要让智能卡不经过PIN 码验证,就能使智能卡中的公钥和证书被读出。
3.3 CSP 密钥容器的存贮结构设计
3.3.1 CSP 密钥容器存贮结构图
图3 为CSP 密钥容器存贮结构图。
.3.2 公开目录(DDF):如图3 所示,公开目录(DDF)下的ADF 子目录下存放RSA 加密公钥及相应证书、RSA 签名公钥及相应证书,容器名称为ADF 目录的名称,可以同时存在多个容器。公开目录(DDF)、容器目录(ADF)、公钥、证书都不设置PIN 码保护,公钥和证书可以随时可以被从智能卡中读出。
3.3.3 私钥目录(DDF):如图3 所示,私钥目录(DDF)下的ADF 子目录下存放RSA 加密密钥对中的私钥和RSA 签名密钥对中的私钥,ADF 目录名称与对应公钥所在的ADF 目录名称相同。私钥目录(DDF)设置PIN 码保护,要使用该目录的子目录下的私钥,必须首先通过私钥目录(DDF)的PIN 码验证。
3.3.4 容器名称:图3 中的私钥目录(DDF)下的容器目录(ADF)名称必须和公开目录(DDF)下的容器目录(ADF)名称对应,比如私钥目录(DDF)下的
容器目录1 和公开目录(DDF)下的容器目录1 的名称必须相同,因为它们实际上是代表着同一个容器名。
3.3.5 容器索引文件:容器索引文件存放着智能卡中的所有容器名称, 并且指明容器名称和容器目录(ADF) 之间的关系。每次调用CSP 的CPAcquireContext函数时,该函数都需要从这个文件中获取智能卡中已有的所有容器名称。容器索引文件的结构可以用如下方式表示:
## 容器名称1# 容器目录1(ADF)## 容器名称2# 容器目录2(ADF)##......#......##
4 CSP 软件架构的设计与实现
4.1 CSP 软件架构的种类
CSP 从整体上看主要有上下文环境对象、密钥对象、哈希对象三种数据结构。在开发CSP 的过程有几种方法来实现对这三种数据结构对象的管理,具体如下:
结构对象的管理,具体如下:
1) 上下文环境对象在CSP 中实现,密钥对象和哈希对象交给微软的纯软件型CSP 来管理。
2) 上下文环境对象和密钥对象在CSP 中实现,哈希对象交给微软的纯软件型CSP 来管理。
3) 上下文环境对象、密钥对象和哈希对象都在CSP 中实现。
其中第3 种方法实现CSP 的复杂性最高,但也最为灵活,本文主要探讨这种方法。由于在CSP 开发中一般都用C 语言或C++语言来实现,因此约定以下用到的数据结构定义均使用C++语言来表述。
4.2 CSP 中几个基本的对象类型分析
通过分析微软定义的CSP 25 个基本函数,可以发现CSP 的上下文环境对象、密钥对象、哈希对象是以HCRYPTPROV、HCRYPTKEY和HCRYPTHASH 三种类型存在的。
HCRYPTPROV 对象类型的作用是串联起整个CSP 的上下文环境。该对象一般由CPAcquireContext 函数产生,由CPReleaseContext函数终止。
HCRYPTKEY 对象类型起到密钥句柄的作用。其存在周期一般是从密钥的产生或者密钥导入开始,经历密钥的使用,最后到密钥句柄被释放的过程。
HCRYPTHASH 对象类型起到哈希句柄的作用。其存在周期一般是从哈希的产生,到哈希的使用,最后是哈希句柄被释放的过程。
推荐文章
论坛热帖