转:【密码学】CSP的概念

CSP加密服务提供者(Cryptographic Service Provider)具有一下几个特点:

  1. CSP是真正执行密码运算的独立模块
  2. 物理上一个CSP由两部分组成:一个动态连接库,一个签名文件
  3. 签名文件保证密码服务提供者经过了认证,以防出现攻击者冒充CSP
  4. 若加密算法用硬件实现,则CSP还包括硬件装置
  5. Microsoft通过捆绑RSA Base Provider,在操作系统中提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。
  6. 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的概念的更多相关文章

  1. 【密码学】CSP的概念

    CSP加密服务提供者(Cryptographic Service Provider)具有一下几个特点: CSP是真正执行密码运算的独立模块 物理上一个CSP由两部分组成:一个动态连接库,一个签名文件 ...

  2. 文件系统取证分析(第11章:NTFS概念)

    /* Skogkatt 开始翻译于2015-01-24,仅作为学习研究之用,谢绝转载. 2015-01-31更新MFT entry 属性概念. 2015-02-01翻译完成. 译注:我翻译这本书的这三 ...

  3. 基于 CSP 的设计思想和 OOP 设计思想的异同

    LinkerLin Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视.标准库的很多设计保留了很浓的OOP的味道.本篇Blog想比较下从设计的角度看,CSP和OO ...

  4. 写给开发人员的实用密码学(七)—— 非对称密钥加密算法 RSA/ECC

    本文部分内容翻译自 Practical-Cryptography-for-Developers-Book,笔者补充了密码学历史以及 openssl 命令示例,并重写了 RSA/ECC 算法原理.代码示 ...

  5. 为你的PHP程序选择合适的密码库(初稿)

    如果本文中的术语让你感到疑惑,请先参阅密码学术语及概念一文. 密码学不是魔术.加密一个应用程序并不能保证它在袭击下的安全(特别是在你没有设置验证密文的情况下).但如果出于商业需求你要确保程序的安全,传 ...

  6. SSL&TlS握手

    SSL/TLS简介 •SSL:安全套接字层(secure socket layer) •TLS:传输层安全协议(transport layer security) SSL和TLS都是加密协议,旨在基于 ...

  7. BOOM -- 智能合约编程

    译注:原文首发于ConsenSys开发者博客,原作者为Eva以及ConsenSys的开发团队.如果您想要获取更多及时信息,可以访问ConsenSys首页点击左下角Newsletter订阅邮件.本文的翻 ...

  8. Java安全API

    java提供了完整的密码学API,我们可以结合密码学相关的概念来系统的学习这些API. 1.密码学简介(crypto) 密码学通俗来说就是研究如何对信息进行加密和破密,如果不是专门研究信息安全,通常我 ...

  9. WPA2密钥重装攻击原理分析

    这两天最火爆的莫过 “WPA2被破解” 这一条大新闻了.我对其原理非常感兴趣,苦于没有找到的文献,所以就整理这么一篇,方便自己和大家理解.主要是根据目前发布的文章以及一些相关资料. 壹.WPA2的机制 ...

随机推荐

  1. LNMP+Zabbix的安装与部署

    LNMP+Zabbix的安装与部署 一.Zabbix简介 1.zabbix是一个基于WEB界面的,并提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务 ...

  2. 什么是位、字节、字、KB、MB?

    1. 位(bit)是计算机里最小的数据单位,每一位的状态只能是0或者1 2. 字节(Byte)      1Byte = 8 bit      它是存储空间的基本计量单位,1byte可以存储一个英文字 ...

  3. UVaLive 7456 Least Crucial Node (并查集+暴力 或者 求割点)

    题意:求标号最小的最大割点.(删除该点后,指定点#sink能到达的点数减少最多). 析:由于不知道要去掉哪个结点,又因为只有100个结点,所以我们考虑用一个暴力,把所有的结点都去一次,然后用并查集去判 ...

  4. 洛谷 - P2335 - 位图 - 简单dp

    https://www.luogu.org/problemnew/show/P2335 假如我们使用dp的话,每次求出一个点的左上方.右上方.左下方.右下方的最近的白点的距离.那么只是n²的复杂度.这 ...

  5. POJ3264【线段树】

    求区间最值-(基础,继续) code---.. #include<cstdio> #include<iostream> #include<string.h> #in ...

  6. zoj2412 dfs连通图

    zoj2412 #include<stdio.h> #include<iostream> #include<cstdio> #include<queue> ...

  7. hdoj2796

    题意: 1.在每一堆里顶部的coin的size必须大于这一堆其他的coin: 2.在每一堆里顶部的coin的size必须大于前面堆的顶部的coin: 3.在每一堆里顶部的coin的num必须大于前面堆 ...

  8. 安装elasticsearch-rtf出错

    出错信息: elasticsearch-rtf   Caused by: java.lang.IllegalStateException: No match found 解决方法: 参考:https: ...

  9. 给Clouderamanager集群里安装可视化分析利器工具Hue步骤(图文详解)

    扩展博客 以下,是我在手动的CDH版本,安装Hue. CDH版本大数据集群下搭建Hue(hadoop-2.6.0-cdh5.5.4.gz + hue-3.9.0-cdh5.5.4.tar.gz)(博主 ...

  10. JAVA常用知识总结(二)

    JAVA中的参数传递总结先看两道笔试题: public class Test2 { public static void main (String [] args) { StringBuffer a ...