internet 安全协议与标准 第 5 课
DESCRIPTION
Internet 安全协议与标准 第 5 课. 唐礼勇 博士 [email protected]. CryptoAPI 简介. 有关加密 API 的国际标准和规范. Generic Security Services API (GSS-API) Intel/OpenGroup CDSA Layered Services Architecture Wide industry support RSA PKCS#11 Cryptographic Token Interface (Cryptoki) Standard 目前最新版本为 2.11 - PowerPoint PPT PresentationTRANSCRIPT
7/10/2003
CryptoAPI 简介
7/10/2003 Internet安全协议及标准Page:3
有关加密 API 的国际标准和规范• Generic Security Services API (GSS-API) • Intel/OpenGroup CDSA
– Layered Services Architecture– Wide industry support
• RSA PKCS#11 Cryptographic Token Interface (Cryptoki) Standard– 目前最新版本为 2.11
• RSA BSAFE API• 微软 CryptoAPI V2.0
– 对微软产品的公共支持• 其中, CDSA 、 RSA PKCS#11 和微软 CryptoAPI 在实际中应用得较多,也是 PKI 推荐使用的加密 API
7/10/2003 Internet安全协议及标准Page:4
其他加密算法库• openssl
– 由 SSLeay 发展而来,可免费使用– 文档严重不足,接口复杂– 为 C 语言设计,但可通过 shell 脚本语言扩展– http://www.openssl.org/
• Crypto++– 使用 C++ 设计,利用了 C++ 的许多特性,自由软件,可免费使用– 文档不足,易用性尚可– http://www.eskimo.com/~weidai/cryptlib.html
• Cryptix– 使用 Java 实现,自由软件 ( 要求版权提示 )– 功能全面,但接口复杂– http://www.cryptix.com/
• Cryptlib– Peter Gutmann 设计,健壮、精心组织、高效– 只对非商业用途免费– 为 C 语言设计,跨平台,支持 Delphi 及其他可使用 ActiveX 的语言– 文档丰富、易用性好– http://www.cs.auckland.ac.nz/~pgut001/cryptlib
• PGP SDK
7/10/2003 Internet安全协议及标准Page:5
Microsoft 的密码系统框架• 微软最先在 1996 关注密码系统问题,引入 CryptoAPI (1.0 and 2.0) 和 CAPICOM• 支持 CryptoAPI 的系统
– Windows 95OSR2, Windows 98/Me– Windows SP3, Windows 2000/XP
• .NET 框架中的安全– 通过引入 System.Security.Cryptography 名字空间
7/10/2003 Internet安全协议及标准Page:6
CryptoAPI 功能• CryptoAPI
– 为应用程序开发者提供在 Win32 环境下使用加密、验证等安全服务时的标准加密接口– CryptoAPI 1.0 包含对密码系统的支持
• 密钥交换、管理• Cryptographic Service Providers
– CryptoAPI 2.0 添加了对证书管理的支持– Cryptographic Service Provider
• 系统结构的可插入构件• 可以通过使用不同的 CSP 来扩展不同的安全功能
• CAPICOM– 一系列对普通 CryptoAPI 2.0 功能进行包装的 COM 类– 尽管可以直接访问 CryptoAPI ,但有时使用 CAPICOM 对象还是要容易些
7/10/2003 Internet安全协议及标准Page:7
CryptoAPI 在系统中的地位GINAGINA AuthenticodeAuthenticode Network InterfaceNetwork Interface
SmartCardSmartCardBasedBased
ComponentsComponents
用户认证用户认证
HardwareHardwareCSPCSP
RSA RSA BasedBasedCSPCSP
编码标准编码标准(PKCS)(PKCS)
证书管理服务证书管理服务Certificate Management ServicesCertificate Management Services
密码服务密码服务Crypto ServicesCrypto Services
CryptoAPICryptoAPI
安全通道安全通道(Secure Channel)(Secure Channel)
SSPISSPI
数据的来源及完整性数据的来源及完整性 认证及通道加密认证及通道加密
阅读器阅读器
7/10/2003 Internet安全协议及标准Page:8
CryptoAPI 的应用
Crypto APICrypto API
RSA baseRSA baseCSPCSP
FortezzaFortezzaCSPCSP
应用程序 应用程序
SmartCard SmartCard CSPCSP
加密服务提供者 CSP(Cryptographic Service Provider)
证书管理服务证书管理服务安全通道安全通道
密钥数据库密钥数据库
证书的存储证书的存储
7/10/2003 Internet安全协议及标准Page:9
CryptoAPI 应用注解• 应用程序不直接和 CSP 通信• 应用程序调用 CryptoAPI 函数, CryptoAPI 函数通过CryptoSPI 由调用实际的 CSP• 由 CryptoAPI 函数中的一个参数来指明使用哪个 CSP进行给定的密码操作。
7/10/2003 Internet安全协议及标准Page:10
CryptoAPI 2.0 的体系结构
7/10/2003 Internet安全协议及标准Page:11
函数分类• CryptoAPI 提供 5 类函数
– Base cryptographic functions• Context functions: 连接 CSP• Key generation functions :生成和存储密钥• Key exchange functions: 交换或传输密钥
– Certificate encode/decode functions– Certificate store functions– Simplified message functions, used to
• encrypt and decrypt messages and data• sign messages and data• verify the authenticity of signatures on received messages and related data
– Low-level message functions
7/10/2003 Internet安全协议及标准Page:12
关于 CSP• CSP 是真正执行加密工作的独立的模块 • 物理上一个 CSP 由两部分组成:一个动态链接库,一个签名文件• 签名文件保证提供者经过了认证,以防出现攻击者冒充CSP 。• 若加密算法用硬件实现,则 CSP 还包括硬件装置• Microsoft 通过捆绑 RSA Base Provider 在操作系统级提供一个 CSP ,使用 RSA 公司的公钥加密算法,更多的 CSP 可以根据需要增加到应用中
– Windows 2k 以后自带了多种不同的 CSP
7/10/2003 Internet安全协议及标准Page:13
不同类型的 CSP• 每个 CSP都有一个名字和一个类型。每个 CSP 的名字是唯一的,而类型则不是。此处着重强调“类型”的特别性。 • 一个 CSP 类型代表了一个特定的家族,这个家族决定了以下因素:
– 有且仅有一个密钥交换算法 ;– 有且仅有一个签名算法 ; – 特定的 Key Blob格式 ; – 特定的数字签名格式 ; – 特定的密钥推导模式 ; – 特定的密钥长度 ; – 特定的分组加密算法的缺省模式
• 若两个或多个应用间欲交换密钥和加密的消息,那么它们必须使用同一类型的 CSP
7/10/2003 Internet安全协议及标准Page:14
预定义的 CSP 类型Provide Type Key exchange Signature Encryption Hashing
PROV_RSA_FULL RSA RSA RC2, RC4 MD5, SHA
PROV_RSA_AES RSA RSA RC2, RC4,AES MD5, SHA
PROV_RSA_SIG None RSA None MD5, SHA
PROV_RSA_SCHANNEL RSA RSA RC4,DES,3DES,+ MD5,SHA
PROV_DSS None DSS None MD5,SHA
PROV_DSS_DH DH DSS CYLINK MEK MD5,SHA
PROV_DH_SCHANNEL DH (临时 ) DSS DES,3DES MD5,SHA
PROV_FORTEZZA KEA DSS Skipjack SHA
PROV_MS_EXCHANGE RSA RSA CAST MD5
PROV_SSL RSA RSA Varies Varies
7/10/2003 Internet安全协议及标准Page:15
CSP 的注册• CSP 信息保存在注册表中,由键值访问。• 在注册表中的提供者键值包括:
– CSP 名称– CSP DLL路径– 数字签名 – 类型 -- CSP type
• Provide Type键值也保存在注册表中– CSP type– CSP 名称 – 必须和上面所说的 CSP 名称相符
7/10/2003 Internet安全协议及标准Page:16
CSP 的设计• 共有 23 个基本密码系统函数由应用程序通过 CAPI 调用, CSP必须支持这些函数
– 这些函数提供了基本的功能,如:加 /解密,导入 /导出密钥,散列数据,验证签名等• CSP 的开发
– 可以使用辅助的 DLL 实现 CSP– 辅助的 DLL 不是 CSP 的一部分,但是包含 CSP 调用的函数– 辅助的 DLL必须被签名,并且签名文件必须可用– 每个 DLL 在装载库之前被验证签名
7/10/2003 Internet安全协议及标准Page:17
密钥库 (Key Storage) I
7/10/2003 Internet安全协议及标准Page:18
密钥库 (Key Storage) II• 每个 CSP 有一个密钥库 • 密钥库用于存储密钥,每个密钥库包括一个或多个密钥容器( Key Containers)• 每个密钥容器中含属于一个特定用户的所有密钥对• 每个密钥容器被赋予一个唯一的名字;以这个名字做函数 CryptAcquireContext 的参数,从而获得指向这个密钥容器的句柄• 通常为每个用户创建一个默认密钥容器,用用户的登录名作为容器名。可以由任意多个应用程序来使用• 一个应用程序也可以创建自己的密钥容器和密钥对
7/10/2003 Internet安全协议及标准Page:19
密钥库 (Key Storage) III• CSP将永久保存每一个密钥容器,包括保存每个密钥容器中的公 /私钥对 • 但在一个 Session完后 CSP将不保存这个 Session 在密钥容器中的会话密钥 • 一个 Session 是指从调用函数 CryptAcquireContext到调用函数 CryptReleaseContext 期间的阶段。当一个 Session 结束后,所有的使用 hProv句柄创建的会话密钥和 Hash值都变为无效
7/10/2003 Internet安全协议及标准Page:20
会话密钥• 在加 /解密数据时使用会话密钥• 会话密钥由应用程序用 CryptGenKey 或 CryptDeriveKey 函数创建• 会话密钥被安全保存在 CSP 中• 不同于公私钥对,会话密钥一般更换频繁。应用程序可以以加密的密钥二进制大对象或 key blob 的形式从 CSP 中导出会话密钥(用 CryptExportKey 函数),以供以后使用或传输给其他用户
7/10/2003 Internet安全协议及标准Page:21
公钥和私钥对• 每个用户通常有两对公私钥对。一对用来加密会话密钥,一对用来创建数字签名
7/10/2003 Internet安全协议及标准Page:22
Key Blob• 在交换密钥时,或密钥需要离开 CSP(即导出密钥 ) 时,就存在选择什么样的数据结构存储密钥的问题• CryptoAPI采用 Key Blob 数据结构存储离开了 CSP内部的密钥• 当使用 CryptExportKey 函数从 CSP 中导出密钥时,Key Blob被创建。之后的某一时间,使用 CryptImportKey 函数将密钥导入到某个 CSP 中(通常是另一个不同的机器上的不同的 CSP)
7/10/2003 Internet安全协议及标准Page:23
Key Blob( 续 )• Key Blob 有一个标准的信息头和位于信息头之后的一段表示密钥本身的数据组成。通常应用程序不访问 Key Blob内部,而是把 Key Blob当作一个透明的对象。 • 由于公 /私钥对的私钥部分需要绝对保密,所以私钥要用对称加密算法加密。加密 Private Key Blob 时,除了 BLOBHEADER之外的所有部分都要加密。但加密所用的算法和密钥(或密钥参数)不与该 Key Blob 存储在一起,应用程序负责管理这些信息
7/10/2003 Internet安全协议及标准Page:24
密钥的物理特性• 同时使用同一会话密钥对两个序列的数据进行加密或解密时,要物理上制作一份该会话密钥的拷贝,即一个物理上的会话密钥不得同时用于两个操作。因为每个会话密钥都包含了内部状态信息,若它同时被用于多个操作,会造成混乱
7/10/2003 Internet安全协议及标准Page:25
处理的消息格式
7/10/2003
CryptoAPI 函数示例
7/10/2003 Internet安全协议及标准Page:27
语言要求• 源代码
– #include <wincrypt.h>– #include <cryptuiapi.h> // 当用到系统定义的对话框时
• 链接要求– 必须同时链接 crypt32.lib advapi32.lib– 有些函数需要链接 cryptui.lib
7/10/2003 Internet安全协议及标准Page:28
初始化 CSP• CryptAcquireContext
– 用来获取特定 CSP 中特定密钥容器的句柄。返回的句柄用来调用选择的 CSP– 进行两项操作 : 首先试图找到由各个参数描述的 CSP ,如果找到 CSP ,函数接着试图在 CSP 中找到与指定容器名匹配的密钥容器。这个函数也可用于创建和销毁密钥容器,取决于参数的值。
• CryptReleaseContext– 用于释放从 CryptAcquireContext 调用返回的句柄– CryptReleaseContext 不删除任何密码系统 API 对象,仅仅释放指向对象的句柄
7/10/2003 Internet安全协议及标准Page:29
7/10/2003 Internet安全协议及标准Page:30
初始化 CSP 注解 (1)• 如上的代码演示了如何取得默认 CSP 的默认密钥容器• 如果对 CryptAcquireContext 的调用成功,返回值将非零,并且变量 hProv 将是一个指向被请求的 CSP 的句柄。• 为了给默认的 CSP创建一个密钥容器,可以使用如下代码
7/10/2003 Internet安全协议及标准Page:31
7/10/2003 Internet安全协议及标准Page:32
初始化 CSP 注解 (2)• 为了从默认 CSP 中删除一个已经存在的密钥容器,可以使用像以下的代码
7/10/2003 Internet安全协议及标准Page:33
如果 CryptAcquireContext 调用成功,返回值将非零, hProv 指向的密钥容器将被删除,并且该密钥容器不再有效。
7/10/2003 Internet安全协议及标准Page:34
Hashing Data• CryptCreateHash, CryptHashData, CryptGetHashParam, 和 CryptDestroyHash • CryptCreateHash
– 用于初始化对数据的散列。返回 CSP hash 对象的句柄 , 这个句柄可以用于以后调用 CryptHashData ,以便散列数据• CryptGetHashParam
– 取回散列值• CryptDestroyHash
– 释放从 CryptCreateHash返回的句柄– 不删除任何密码系统 API 对象,仅仅释放指向 hash 对象的句柄
7/10/2003 Internet安全协议及标准Page:35
7/10/2003 Internet安全协议及标准Page:36
7/10/2003 Internet安全协议及标准Page:37
Hashing Data 注解• 以上的例子对 pBuffer 指向的数据产生了一个 hash值。• 如果有更多的数据需要 hash ,可以通过重复调用 CryptHashData 计算散列值• 注意
– 用 HP_HASHVAL 参数调用 CryptGetHashParam 将阻止任何用那个对象的更进一步的散列– 考察MDx 系列计算
• MDx_Init(&md_ctx);• MDx_Update(&md_ctx, data, len); //repeat until no more data• MDx_Final(md, &md_ctx);
7/10/2003 Internet安全协议及标准Page:38
Generating Keys• CryptDeriveKey, CryptGenKey, CryptDestroyKey• CryptDeriveKey
– 用于从一个特定的口令产生一个密钥• CryptGenKey
– 用于从随机数产生会话密钥或公私钥对– 如果使用了本函数 , 推荐使用 CRYPT_EXPORTABLE 参数来创建一个可导出的会话密钥。这样该会话密钥可以从一个计算机移到另一个计算机,否则返回的密钥将只存在于特定的计算机 /会话
• CryptDestroyKey – 用于释放对密钥对象的句柄
7/10/2003 Internet安全协议及标准Page:39
7/10/2003 Internet安全协议及标准Page:40
7/10/2003 Internet安全协议及标准Page:41
Generating Keys 注解•上例显示如何使用 CryptDeriveKey 函数,假定 pPassword 指向一个用户定义的口令, dwPasswordLength 是口令的长度
7/10/2003 Internet安全协议及标准Page:42
En/Decrypting Data• CryptEncrypt, CryptDecrypt:
– 可以说整个 Crypto API就围绕着这两个函数• 两个函数的前六个参数相同
– 前两个参数仅仅是密钥的句柄和可选的 hash 对象– 第三个参数是一个布尔值,保持为 False 直到最后一块数据,当处理最后一块数据时必须设为 Ture ,以便函数对最后一块数据进行一些特殊处理– 第四和第五个参数仅仅是一个标记值和一个指向将要被加解密的数据的指针– 第六个参数是一个指向保存在 buffer 中将被加 /解密的字符数的指针
• CryptEncrypt 还有第 7个参数– 指定了 Block 的大小,可用于处理密文长于明文的情况
7/10/2003 Internet安全协议及标准Page:43
7/10/2003 Internet安全协议及标准Page:44
En/Decrypting Data 注解• 当用相同的密钥同时加解密两个数据流时,需要小心。相同的物理会话密钥不能用于两个操作,因为每个会话密钥包含内部状态信息,如果同时用于多个操作可能会引起混乱 • 一个相对简单的解决方法是对会话密钥做拷贝
– 拷贝会话密钥可以使用 CryptExportKey 导出密钥,然后用 CryptImportKey 导回。当密钥被导入, CSP将给“新”密钥分配自己的内部内存,在逻辑上和原密钥毫无关系
7/10/2003 Internet安全协议及标准Page:45
其他问题• 示例未涉及到的地方
– 随机数生成:符合 FIPS140-1 标准• CryptGenRandom(hProv, dwLen, pbBuffer);
– 证书管理• DPAPI (Data Protection API)
– 同 CryptoAPI相关的另一个API– crypt32.dll 的一部分– a pair of function calls that provide OS-level data protection services to user and system processes
7/10/2003 Internet安全协议及标准Page:46
参考资料• MSDN
– From CDROW/DVD– From network
7/10/2003 Internet安全协议及标准Page:47
ChangeLog• 2003.7.10 v1.0 By T.L.Yong
– Refine PPT and Fix many bugs.– Initialize from Ding Ruipeng’s PPT