【转】密码学 :CSP的概念
转:【密码学】CSP的概念
CSP加密服务提供者(Cryptographic Service Provider)具有一下几个特点:
- CSP是真正执行密码运算的独立模块
- 物理上一个CSP由两部分组成:一个动态连接库,一个签名文件
- 签名文件保证密码服务提供者经过了认证,以防出现攻击者冒充CSP
- 若加密算法用硬件实现,则CSP还包括硬件装置
- Microsoft通过捆绑RSA Base Provider,在操作系统中提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。
- Windows 2000以后自带了多种不同的CSP
一、CSP服务体系
CSP服务体系分层
CSP服务体系从系统结构,系统调用层次方面来看,分为相互独立的三层(如上图:服务分层体系):
1)最底层是加密服务提供层,即具体的一个CSP,它是加密服务提供机构提供的独立模块,担当真正的数据加密工作,包括使用不同的加密和签名算法产生密钥,交换密钥、进行数据加密以及产生数据摘要、数字化签名它是独立于应用层和操作系统,其提供的通用的SPI编程接El与操作系统层进行交互;有些CSP使用特殊硬件一起担当加密工作,而有些则通过RPC分散其功能,以达到更为安全。
2)中间层,即操作系统(0S)层,在此是指具体的Win9X、NT和2K及更高版本的32位操作平台,在CSP体系中,以及为应用层提供统一的API接口,为加密服务提供层提供SPI接口,操作系统层为应用层隔离了底层CSP和具体加密实现细节,用户可独立各个CSP进行交互它担当一定管理功能,包括定期验证CSP等。
3)应用层,也就是任意用户进程或线程具体通过调用操作系统层提供的Crypto API使用加密服务的应用程序。
根据CSP服务分层体系,应用程序不必关心底层CSP的具体实现细节,利用统一的API接口进行编程,而由操作系统通过统一的SPI接口来与具体的加密服务提供者进行交互,由其他的厂商根据服务编程接口SPI实现加密、签名算法,有利于实现数字加密与数字签名。
应用程序中要实现数字加密与数字签名时,一般是调用微软提供的应用程序编程接口Crypto API。应用程序不能直接与加密服务提供者(CSP)通信,只能通过Crypto API操作系统界面过滤后,经过Crypto SPI系统服务接口与相应的CSP通信。CSP才是真正实现所有加密操作的独立模块。
二、CSP组成
CSP为Windows平台上加解密运算的最核心层实现,是真正执行加密工作的独立的模块。CSP与Windows的接口以DLL形式实现,CSP是真正执行加密工作的独立模块。
按照CSP的不同实现方法,可分为纯软件实现与带硬件的实现,其中带硬件的实现CSP按照硬件芯片不同,可以分为使用智能卡芯片(内置加密算法)的加密型和不使用智能卡芯片的存储型两种,与计算机的接口现在一般都用USB,所以把CSP硬件部分称为USB Key。
物理上一个CSP由这几部分组成:动态链接库,签名文件,签名文件保证提供者经过了认证,操作系统能识别CSP,操作系统可利用其定期验证CSP,保证其未被篡改。还可以使用辅助的DLL实现CSP,辅助的DLL不是CSP的一部分,但是包含CSP调用的函数,辅助的DLL也必须被签名,并且签名文件必须可用,每个DLL在装载库之前被验证签名,每个CSP都有一个名字和一个类型。若有硬件实现,则CSP还包括硬件装置。CSP逻辑上主要由以下部分组成(如图CSP组成):
(1)微软提供的SPI接口函数实现。在微软提供的SPI接口中共有23个基本密码系统函数由应用程序通过CAPI调用,CSP必须支持这些函数,这些函数提供了基本的功能。
(2)加密签名算法实现。如果是纯软件实现的CSP与用存储型的USB Key实现的CSP,这些函数就在CSP的DLL或辅助DLL中实现,带硬件设备实现的CSP,并且用加密型的USB Key,CSP的动态库就是一个框架,一般的函数实现是在CSP的动态库中,而主要函数的核心是在硬件中实现,在CSP的动态库中只是函数的框架,如:加/解密,散列数据,验证签名等,这是因为私钥一般不导出,这些函数的实现主要在硬件设备中,保密性好。
(3)CSP的密钥库及密钥容器,每一个加密服务提供程序都有一个独立的密钥库,它是一个CSP内部数据库,此数据库包含一个和多个分属于每个独立用户的容器,每个容器都用一个独立的标识符进行标识。不同的密钥容器内存放不同用户的签名密钥对与交换密钥对以及x.509数字证书。出于安全性考虑,私钥一般不可以被导出。带硬件实现的CSP,CSP的密钥库及密钥容器放在硬件存储器中,纯软的CSP实现是放在硬盘上的文件中。
三、CSP实现
在实现微软的CSP时采取了如上图所示:CSP设计框架。通过智能密码钥匙专用API实现了微软CSP。为了兼容NetScape浏览器等所支持的PKCS#11,在实现PKCS#ll的基础上,通过调用PKCS#ll接口实现微软CSP服务编程接口。这样在其它操作系统平台上实现PKCS时也就方便了很多。
用户界面获取PIN
当一个应用要求访问用户私钥或其他身份信息时,必须首先使用用户身份识别码(PIN)来认证用户,如图所示:用户界面获取PIN。通过了认证的程序允许访问身份密钥中的用户敏感数据。用户程序对身份密钥中用户敏感数据的访问必须在一个事务中完成。事务开始前,身份钥处于未认状态;事务结束后,身份密钥仍然返回未认证状态。为了避免每一次操作都要求用户输入PIN,应该在CSP内部缓存用PIN。所有关于用户PIN的显示和操作都必须从这个缓存中直接获得,并且这个缓存的PIN必须与特定登录用户和特定用户身份密钥同步关联,一旦登录用户改变或身份密钥从主机中取出,就必须清除相应的PIN缓存。
四、支持的CSP模块函数
中孚智能密码钥匙通过提供标准的CSP模块实现了与CryptoAPI应用程序无缝的集成。中孚智能密码钥匙的CSP模块是遵从微软的Crypto Service Provider编程规范编写,可以兼容现在和将来的CryptoAPI应用。次CSP是一个PROV_RSA_FULL类型的CSP,它具有一下特点:
提供了安全RSA密钥对容器
提供多种分组和Hash算法
硬件实现RSA运算
支持国产加密算法
编写的个人数字证书载体
以下所列是中孚智能密码钥匙支持的CSP模块函数,这些函数是CSP SPI,CryptoAPI应用程序不用直接调用这些接口,通过微软的安全体系间接调用。
名称 |
描述 |
连接函数 |
|
CPAcquireContext |
为应用程序创建一个上下文 |
CPGetProvParam |
获取CSP相关信息 |
CPReleaseContext |
释放CPAcquireContext获取的上下文 |
CPGetProvParam |
设置CSP相关参数 |
密钥生成和交换函数 |
|
CPDeriveKey |
从一个数据散列中生成一个会话密钥,保证生成的密钥互不相同 |
CPDestroyKey |
释放密钥句柄,释放后密钥句柄无效,密钥将不能再被访问 |
CPDuplicateKey |
创建密钥的拷贝 |
CPExportKey |
从CSP密钥容器中导出密钥 |
CPImportKey |
从一个Blob中导入密钥到CSP容器中 |
CPGenKey |
生成密钥或者密钥对 |
CPGenRandom |
生成随机数 |
CPSetKeyParam |
设置密钥属性 |
CPGetKeyParam |
获取密钥属性 |
CPGetUserKey |
获取密钥容器中持久密钥对 |
数据加密函数 |
|
CPEncrypt |
加密明文 |
CPDecrypt |
解密密文 |
散列和数字签名函数 |
|
CPCreateHash |
初始化散列对象 |
CPDestroyHash |
删除散列对象 |
CPDublicateHash |
创建散列对象拷贝 |
CPSetHashParam |
设置散列对象属性 |
CPGetHashParam |
获取散列对象属性 |
CPHashData |
散列输入数据 |
CPHashSessionKey |
散列一个会话密钥 |
CPSignHash |
签名一个散列对象 |
CPVerifySignature |
验证一个散列对象 |
CPAcquireContext函数是所有CSP函数中最先被调用的函数。上层应用通过调用这个函数来指定操作那一个密钥容器。每个密钥容器中同时只能保存一对RSA密钥对,和任意多个会话密钥。RSA密钥对是可以持久保存的对象,而会话密钥只能在运行时候存在。如果应用程序需要访问密钥容器中的RSA私钥,则中孚智能密钥钥匙的CSP将会要求验证用户的PIN码。将弹出验证用户PIN码的对话框。用户输入正确的PIN码,验证正确以后CSP模块将进行后续的操作。
【转】密码学 :CSP的概念的更多相关文章
- 【密码学】CSP的概念
CSP加密服务提供者(Cryptographic Service Provider)具有一下几个特点: CSP是真正执行密码运算的独立模块 物理上一个CSP由两部分组成:一个动态连接库,一个签名文件 ...
- 文件系统取证分析(第11章:NTFS概念)
/* Skogkatt 开始翻译于2015-01-24,仅作为学习研究之用,谢绝转载. 2015-01-31更新MFT entry 属性概念. 2015-02-01翻译完成. 译注:我翻译这本书的这三 ...
- 基于 CSP 的设计思想和 OOP 设计思想的异同
LinkerLin Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视.标准库的很多设计保留了很浓的OOP的味道.本篇Blog想比较下从设计的角度看,CSP和OO ...
- 写给开发人员的实用密码学(七)—— 非对称密钥加密算法 RSA/ECC
本文部分内容翻译自 Practical-Cryptography-for-Developers-Book,笔者补充了密码学历史以及 openssl 命令示例,并重写了 RSA/ECC 算法原理.代码示 ...
- 为你的PHP程序选择合适的密码库(初稿)
如果本文中的术语让你感到疑惑,请先参阅密码学术语及概念一文. 密码学不是魔术.加密一个应用程序并不能保证它在袭击下的安全(特别是在你没有设置验证密文的情况下).但如果出于商业需求你要确保程序的安全,传 ...
- SSL&TlS握手
SSL/TLS简介 •SSL:安全套接字层(secure socket layer) •TLS:传输层安全协议(transport layer security) SSL和TLS都是加密协议,旨在基于 ...
- BOOM -- 智能合约编程
译注:原文首发于ConsenSys开发者博客,原作者为Eva以及ConsenSys的开发团队.如果您想要获取更多及时信息,可以访问ConsenSys首页点击左下角Newsletter订阅邮件.本文的翻 ...
- Java安全API
java提供了完整的密码学API,我们可以结合密码学相关的概念来系统的学习这些API. 1.密码学简介(crypto) 密码学通俗来说就是研究如何对信息进行加密和破密,如果不是专门研究信息安全,通常我 ...
- WPA2密钥重装攻击原理分析
这两天最火爆的莫过 “WPA2被破解” 这一条大新闻了.我对其原理非常感兴趣,苦于没有找到的文献,所以就整理这么一篇,方便自己和大家理解.主要是根据目前发布的文章以及一些相关资料. 壹.WPA2的机制 ...
随机推荐
- LNMP+Zabbix的安装与部署
LNMP+Zabbix的安装与部署 一.Zabbix简介 1.zabbix是一个基于WEB界面的,并提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务 ...
- 什么是位、字节、字、KB、MB?
1. 位(bit)是计算机里最小的数据单位,每一位的状态只能是0或者1 2. 字节(Byte) 1Byte = 8 bit 它是存储空间的基本计量单位,1byte可以存储一个英文字 ...
- UVaLive 7456 Least Crucial Node (并查集+暴力 或者 求割点)
题意:求标号最小的最大割点.(删除该点后,指定点#sink能到达的点数减少最多). 析:由于不知道要去掉哪个结点,又因为只有100个结点,所以我们考虑用一个暴力,把所有的结点都去一次,然后用并查集去判 ...
- 洛谷 - P2335 - 位图 - 简单dp
https://www.luogu.org/problemnew/show/P2335 假如我们使用dp的话,每次求出一个点的左上方.右上方.左下方.右下方的最近的白点的距离.那么只是n²的复杂度.这 ...
- POJ3264【线段树】
求区间最值-(基础,继续) code---.. #include<cstdio> #include<iostream> #include<string.h> #in ...
- zoj2412 dfs连通图
zoj2412 #include<stdio.h> #include<iostream> #include<cstdio> #include<queue> ...
- hdoj2796
题意: 1.在每一堆里顶部的coin的size必须大于这一堆其他的coin: 2.在每一堆里顶部的coin的size必须大于前面堆的顶部的coin: 3.在每一堆里顶部的coin的num必须大于前面堆 ...
- 安装elasticsearch-rtf出错
出错信息: elasticsearch-rtf Caused by: java.lang.IllegalStateException: No match found 解决方法: 参考:https: ...
- 给Clouderamanager集群里安装可视化分析利器工具Hue步骤(图文详解)
扩展博客 以下,是我在手动的CDH版本,安装Hue. CDH版本大数据集群下搭建Hue(hadoop-2.6.0-cdh5.5.4.gz + hue-3.9.0-cdh5.5.4.tar.gz)(博主 ...
- JAVA常用知识总结(二)
JAVA中的参数传递总结先看两道笔试题: public class Test2 { public static void main (String [] args) { StringBuffer a ...