CSP开发大全.docx
- 文档编号:11434056
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:31
- 大小:626.70KB
CSP开发大全.docx
《CSP开发大全.docx》由会员分享,可在线阅读,更多相关《CSP开发大全.docx(31页珍藏版)》请在冰豆网上搜索。
CSP开发大全
第一章CryptoAPI简介
一、有关加密API的国际标准和规范
ØGenericSecurityServicesAPI(GSS-API)
ØIntel/OpenGroupCDSA
ØRSAPKCS#11CryptographicTokenInterface(Cryptoki)Standard
ØRSABSAFEAPI
Ø微软CryptoAPIV2.0
其中,CDSA、RSAPKCS#11和微软CryptoAPI在实际中应用得较多,也是PKI推荐使用的加密API。
二、微软CryptoAPI
微软最先在1996关注密码系统问题,引入CryptoAPI(1.0and2.0)和CAPICOM
支持CryptoAPI的系统:
Windows95OSR2,Windows98/Me,WindowsSP3,Windows2000/XP
.NET框架中的安全:
通过引入System.Security.Cryptography名字空间
ØCryptoAPI:
为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。
ØCryptoAPI1.0:
包含对密码系统的支持,密钥交换、管理、CryptographicServiceProviders
ØCryptoAPI2.0:
添加了对证书管理的支持。
ØCryptographicServiceProviders:
系统结构的可插入构件,可以通过使用不同的CSP来扩展不同的安全功能。
三、CryptoAPI在系统中的地位
微软的CryptoAPI是Win32平台下为应用程序开发者提供的数据加密和安全的编码接口。
CryptoAPI函数集包含了基本的ASN.1的编码、解码,散列,数据加密和解密,数字证书管理等重要的密码学应用功能。
数据的加密、解密支持对称和非对称两类算法。
CryptoAPI是所有微软的Win32的应用程序以及第三方厂商应有程序使用的数据加密接口,诸如InternetExplorer、OutLook、Adobe等应用都是基于CryptoAPI开发的。
在不安全的网络上进行安全的数据传输涉及三个方面的要求:
信息隐藏,身份鉴别和完整性检验。
CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。
信息隐藏
信息隐藏的意义是保障信息内容只能被特定的人获取。
信息隐藏通常是使用某种形式的密码学方式。
数据加密算法能保障信息的安区隐藏和传输。
数据加密算法是将明文数据经过一定的变换使其看上去是一组毫无意义的数据。
在没有加密密钥的情况下,对于好的加密算法想从密文获取明文信息是不可能的。
被加密的数据可以是任意的ASCII编码文本文件,数据库文件,和任意需要进行安全传输的数据。
这里,“信息”是指任意的一段数据,“明文”是指任意一段没有被加密的数据,“密文”是指任意一段加密的数据。
被加密的数据可以在不安全的通道上进行传输而不伤害其安全性。
之后,密文可以被还原成明文,如下图所示:
数据加密和解密的概念是:
对数据加密的时候需要一个加密密钥,相当于门上的一把钥匙。
解密的时候,需要使用一个解密密钥来解开数据。
加密密钥、解密密钥可以相同也可以不相同。
加密密钥必须小心保存,给其它用户的时候也必须通过安全的通道传递。
对解密密钥的访问权限必须小心控制,因为拥有解密密钥意味着可以解开所有相应加密密钥加密的信息。
身份鉴别
安全通讯的前提是通讯的双方知道对方的身份。
身份鉴别的任务就是鉴别一个用户或者实体的真实身份。
标识用户身份的文档通常被称为信任状或者凭证。
身份鉴别有时候也用来判定接受的数据就是被发送的数据。
如果A向B发送了一段数据,B需要鉴别这段数据就是A发出去的,而不是其它冒充A发出去的。
为了满足这类验证的需求,CryptoAPI提供数字签名和校验函数,用来对信息进行鉴别。
因为在计算机网网络上传输的数据与用户之间并没有物理连接,因此对数据进行鉴别的凭证也必须能够在网络上进行传输。
这种凭证必须由受信任的凭证发行机构发行。
数字证书就是平常说的证书就是这种凭证,是计算机在网络上进行身份验证的有效凭证。
数字证书是由一个被称为证书机构的信任组织或实体颁发的凭证。
它包含与证书对应的用户公钥以及其它一些记录证书主题和用户信息的数据。
证书机构只有在验证了证书主题和证书对应的用户公钥的有效性之后才会签发证书。
证书申请者和证书机构之间交换签发证书信息可以使用物理介质,比如软盘,进行传输。
通常,这种信息都是在计算机网络上进行完成的。
证书机构使用被信任的服务程序处理用户的请求和证书的签发工作。
完整性检测
任何通过不安全介质传输的信息都可以被意外或蓄意的修改。
在现实世界中,盖章、签名就是用来提供和证明信息完整性的工具。
信息的接收者不但需要确定信息是由谁发送的,还要确定自己收到的信息是发送者发送的信息,而没有任何的变化。
要建立数据的完整性检测机制,不仅要发送信息本身,还要发送用来校验数据的信息,这一信息通常被称作哈希值。
数据和验证信息都可以与数字签名一起发送来证明其完整性。
四、CryptoAPI的应用
CryptoAPI函数使用“加密服务提供者”(CSP)完成数据加密、解密以及密钥的存储管理、所有的CSP都是相互独立的模块。
理论上,CSP应该独立于特定的应用程序,也就是说所有的应用程序可以使用任何一个CSP。
但是,实际上有些应用程序只能与特定的CSP协作。
CSP与应用程序之间的关系类似于WindowsGDI模型。
CSP就类似于图形硬件驱动程序。
密钥存储的安全性完全取决于CSP的具体实现和操作系统没有任何关系。
这就使得应用程序无需修改就可以运行于多种安全环境之下。
应用程序于机密模块之间的访问控制必须受到严格的控制。
只要这样才能保证应用的安全性和移植性。
要遵循以下三条原则:
1、应用程序不能直接访问密钥的内容。
因为所有密钥都是在CSP内部产生的,应用程序通过不透明的句柄进行访问。
这就避免了应用程序和其相关联的动态连接库泄密密钥或使用不好的随机数产生密钥的可能性。
2、应用程序不能指定加密操作细节。
CSP允许应用程序选择进行加密或者签名操作使用的算法类型,但是实际的操作完全由CSP内部进行控制。
3、应用程序不处理用户的信任凭证或其它身份鉴别数据。
用户的鉴别是由CSP完成的。
因此,对于未来可能出现的身份验证方式,例如人体识别技术,应用程序无需修改其身份验证的模型。
五、CryptoAPI函数简介
CryptoAPI体系主要由一下几部分组成:
基本加密函数、证书编码与解码函数、证书存储函数、简化信息处理函数、底层信息处理函数。
1、基本加密函数
基本加密函数为开发加密应用程序提供了足够灵活的空间。
所有CSP的通讯都是通过这些函数。
一个CSP是实现所有加密操作的独立模块。
在每一个应用程序中至少需要提供一个CSP来完成所需的加密操作。
如果使用多于一个以上的CSP,在加密函数调用中就要指定所需的CSP。
微软基本加密提供者(MicrosoftBaseCryptographicProvider),是缺省绑定到CryptoAPI里的。
如果没有指定其他CSP时,这个CSP就是却省的。
每一个CSP对CryptoAPI提供了一套不同的实现。
一些提供了更加强大的加密算法,而其他一些CSP包含了对硬件的支持,比如智能卡。
另外,一些CSP偶尔和使用者直接通讯,比如数字签名就使用了用户的签名私钥。
基本加密函数包含了以下几种:
服务提供者函数:
应用程序使用服务提供者函数来连接和断开一个CSP。
下面就是主要的API:
CryptAcquireContext
获得指定CSP的密钥容器的句柄
CryptContextAddRef
对HCRYPTPROV句柄增加一个应用计数
CryptEnumProviders
枚举当前计算机中的CSP
CryptEnumProviderTypes
枚举CSP的类型
CryptGetDefaultProvider
对于指定CSP类型的却省CSP
CryptGetProvParam
得到一个CSP的属性
CryptInstallDefaultContext
安装先前得到的HCRYPTPROV上下文作为当前却省的上下文
CryptReleaseContext
释放由CryptAcquireContext得到的句柄
CryptSetProvider和
CryptSetProviderEx
为指定CSP类型指定一个却省的CSP
CryptSetProvParam
指定一个CSP的属性
CryptUninstallDefaultContext
删除先前由CryptInstallDefaultContext安装的却省上下文
密钥的产生和交换函数:
密钥产生函数创建、配置和销毁加密密钥。
他们也用于和其他用户进行交换密钥。
下面就是主要的一些函数:
CryptAcquireCertificatePrivateKey
对于指定证书上下文得到一个HCRYPTPROV句柄和dwKeySpec
CryptDeriveKey
从一个密码中派生一个密钥
CryptDestoryKey
销毁密钥
CryptDuplicateKey
制作一个密钥和密钥状态的精确复制
CryptExportKey
把CSP的密钥做成BLOB传送到应用程序的内存空间中
CryptGenKey
创建一个随机密钥
CryptGenRandom
产生一个随机数
CryptGetKeyParam
得到密钥的参数
CryptGetUserKey
得到一个密钥交换或签名密钥的句柄
CryptImportKey
把一个密钥BLOB传送到CSP中
CryptSetKeyParam
指定一个密钥的参数
编码/解码函数:
有一些编码/解码函数,他们可以用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。
以下就是这几个函数:
CryptDecodeObject
对lpszStructType结构进行解码
CryptDecodeObjectEx
对lpszStructType结构进行解码,此函数支持内存分配选项
CryptEncodeObject
对lpszStructType结构进行编码
CyptEncodeObjectEx
对lpszStructType结构进行编码,此函数支持内存分配选项
数据加密/解密函数:
这些函数支持数据的加密/解密操作。
CryptEncrypt和CryptDecrypt要求在被调用前指定一个密钥。
这个密钥可以由CryptGenKey、CryptDeriveKey或CryptImportKey产生。
创建密钥时要指定加密算法。
CryptSetKeyParam函数可以指定额外的加密参数。
CryptDecrypt
使用指定加密密钥来解密一段密文
CryptEncrypt
使用指定加密密钥来加密一段明文
CryptProtectData
执行对DATA_BLOB结构的加密
CryptUnprotectData
执行对DATA_BLOB结构的完整性验证和解密
哈希和数字签名函数:
这些函数在应用程序中完成计算哈希、创建和校验数字签名。
CryptCreateHash
创建一个空哈希对象
CryptDestoryHash
销毁一个哈希对象
CryptDuplicateHash
复制一个哈希对象
CryptGetHashParam
得到一个哈希对象参数
CryptHashData
对一块数据进行哈希,把它加到指定的哈希对象中
CryptHashSessionKey
对一个会话密钥进行哈希,把它加到指定的哈希对象中
CryptSetHashParam
设置一个哈希对象的参数
CryptSignHash
对一个哈希对象进行签名
CryptVerifySignature
校验一个数字签名
2、证书和证书库函数
这组函数管理、使用和取得证书、证书撤销列表和证书信任列表。
这些函数可以分成一下几组:
证书库函数:
一个用户站点可以收集许多证书。
这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。
对于每个人,可能有一个以上的证书。
证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。
以下就是这些函数:
CertAddStoreToCollection
在证书库中增加一个证书
CertCloseStore
关闭一个证书库句柄
CertControlStore
如果证书缓冲区和证书本身内容不相符时,允许给应用程序发一个通知
CertDuplicateStore
通过增加引用计数来复制证书库句柄
CertEnumPhysicalStore
对于指定系统库枚举物理库
CertEnumSystemStore
枚举所有可用的系统库
CertEnumSystemStoreLocation
枚举可用系统库的所有位置
CertGetStoreProperty
得到一个库的属性
CertOpenStore
使用指定库类型来打开证书库
CertOpenSystemStore
打开一个系统证书库
CertRegisterPhysicalStore
在一个注册系统库里增加一个物理库
CertRegisterSystemStore
注册一个系统库
CertRemoveStoreFromCollection
从一个库集合里删除证书库
CertSaveStore
保存证书库
CertSetStoreProperty
设置证书属性
CertUnregisterPhysicalStore
从系统库中删除一个物理库
CertUnregisterSystemStore
反注册一个指定系统库
维护函数:
CryptoAPI提供了证书和证书库函数如下:
CertAddSerializeElementToStore
在库中增加一系列证书或CRL
CertCreateContext
从编码字节中创建指定上下文
CertEnumSubjectInSortedCTL
在CTL库中枚举信任主题
CertFindSubjectInCTL
在CTL中寻找指定主题
CertFindSubjectInSortedCTL
在分类CTL中寻找指定主题
证书函数:
下列函数是针对于证书的。
大多数函数都是处理CRL和CTL的。
CertAddCertificateContextToStore
在证书库里增加一个证书上下文
CertAddCertificateLinkToStore
在证书库里增加一个对不同库里的证书上下文的链接
CertAddEncodedCertificateToStore
把编码证书转换成证书上下文并且把它加到证书库里
CertCreateCertificateContext
从编码证书中创建一个证书上下文。
但这个上下文并不放到证书库里
CertCreateSelfSignCertificate
创建一个自签名证书
CertDeleteCertificateFromStore
从证书库里删除一个证书
CertDuplicateCertificate
通过增加引用计数来复制证书上下文
CertEnumCertificateInStore
在证书库里枚举证书上下文
CertFindCertificateInStore
在证书库里寻找证书上下文
CertFreeCertificateContext
释放一个证书上下文
CertGetIssuerCertificateFromStore
在证书库里得到指定主题证书的发行者
CertGetSubjectCertificateFromStore
获得主题证书的上下文
CertGetValidUsages
返回所有证书的用法
CertSerializeCertificateStoreElement
串行化编码证书的证书上下文
CertVerifySubjectCertificateContext
使用发行者来验证主题证书
CryptUIDlgViewContext
显示证书、CRL或CTL
CryptUIDlgSelectCertificateFromStore
从指定库中显示对话框,可以从中选择证书
证书撤销列表函数:
CertAddCRLContextToStore
在证书库里增加一个CRL上下文
CertAddCRLLinkToStore
在不同的库里增加一个CRL上下文链接
CertAddEncodedCRLToStore
把编码CRL转化成CRL上下文然后把它加入到证书库中
CertCreateCRLContext
从编码CRL中创建CRL句柄,但不把它加到库中
CertDeleteCRLFromStore
从证书库里删除一个CRL
CertDuplicateCRLContext
通过增加引用计数来复制CRL上下文
CertEnumCRLsInStore
枚举库里的CRL句柄
CertFindCertificateInCRL
从指定证书里寻找CRL列表
CertFindCRLInStore
在库里寻找CRL上下文
CertFreeCRLContext
释放CRL上下文
CertGetCRLFromStore
从库里得到CRL上下文句柄
CertSerializeCRLStoreElement
串行化CRL上下文的编码CRL和它的属性
证书信任列表函数:
CertAddCTLContextToStore
把一个CTL上下文加入到证书库里
CertAddCTLLinkToStore
给不同库里的CRL上下文添加链接
CertAddEncodedCTLToStore
把编码CTL转化成CTL上下文并且把它加到证书库里
CertCreateCTLContext
从编码CTL中创建CTL上下文
CertDeleteCTLFromStore
从证书库里删除CTL
CertDuplicateCTLContext
通过增加引用计数来复制CTL上下文
CertEnumCTLsInStore
在证书库里枚举CTL上下文
CertFindCTLInStore
在证书库里查找CTL上下文
CertFreeCTLContext
释放CTL上下文
CertSerializeCTLStoreElement
串行化CTL上下文的编码CTL和属性
扩展属性函数:
CertEnumCertificateContextProperties
枚举指定证书上下文的属性
CertEnumCRLContextProperties
枚举指定CRL上下文的属性
CertEnumCTLContextProperties
枚举指定CTL上下文的属性
CertGetCertificateContextProperty
得到证书属性
CertGetCRLContextProperty
得到CRL属性
CertGetCTLContextProperty
得到CTL属性
CertSetCertificateContextProperty
设置证书属性
CertSetCRLContextProperty
设置CRL属性
CertSetCTLContextProperty
设置CTL属性
3、证书验证函数
证书验证是通过CTL和证书列表进行的。
使用CTL的函数:
CertVerifyCTLUsage
验证CTL用法
CryptMsgEncodeAndSignCTL
编码和验证CTL
CryptMsgGetAndVerifySigner
从一个消息中获得和验证CTL
CryptMsgSignCTL
对包含CTL的消息进行签名
证书链验证函数:
CertCreateCertificateChainEngine
为应用程序创建一个新的非却省的链引擎
CertCreateCTLEntryFromCertificateContextProperties
创建一个CTL入口
CertDuplicateCertificateChain
通过增加引用计数来复制证书链
CertFindChainInStore
在证书库里查找证书链
CertFreeCertificateChain
释放证书链
CertFreeCertificateChainEngine
释放证书链引擎
CertGetCertificateChain
从最后一个证书建立一个上下文链表
CertSetCertificateContextPropertiesFromCTLEntry
通过CTL入口属性来设置证书上下文的属性
CertIsValidCRLForCertificate
通过检查CRL来确定CRL是否包括指定被撤销的证书
CertVerifyCertificateChainPolicy
通过检查证书链来确定它的完整性
4、消息函数
CryptoAPI消息函数包括两组:
低级消息函数和简化消息函数。
低级消息函数直接和PKCS#7消息工作。
这些函数对传输的PKCS#7数据进行编码,对接收到的PKCS#7数据进行解码,并且对接收到的消息进行解密和验证。
简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。
这些函数在完成一个任务时,减少了函数调用的数量,因此简化了CryptoAPI的使用。
低级消息函数:
CryptMsgCalculateEncodedLength
计算加密消息的长度
CryptMsgClose
关闭加密消息的句柄
CryptMsgControl
执行指定的控制函数
CryptMsgCountersign
标记消息中已存在的签名
CryptMsgCountersignEncoded
标记已存在的签名
CryptMsgDuplicate
通过增加引用计数来复制加密消息句柄
CryptMsgGetParam
对加密消息进行编码或者解码后得到的参数
CryptMsgOpenToDecode
打开加密消息进行解码
CryptMsgOpenToEncode
打开加密消息进行编码
CryptMsgUpdate
更新加密消息的内容
CryptMsgVerifyCountersignatureEncoded
验证SignerInfo结构中标记时间
CryptMsgVerifyCountersignatureEncodedEx
验证SignerInfo结构中标记时间签名者可以是CERT_PUBLIC_KEY_INFO结构
简化消息函数:
CryptDecodeMessage
对加密消息进行解码
CryptDecryptAndVerifyMessageSignature
对指定消息进行解密并且验证签名者
CryptDecryptMessage
解密指定消息
CryptEn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CSP 开发 大全