1 / 47

Internet 安全协议与标准 第 5 课

Internet 安全协议与标准 第 5 课. 唐礼勇 博士 tly@infosec.pku.edu.cn. 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

Download Presentation

Internet 安全协议与标准 第 5 课

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Internet安全协议与标准第5课 唐礼勇 博士 tly@infosec.pku.edu.cn

  2. CryptoAPI简介

  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 Internet安全协议及标准

  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 Internet安全协议及标准

  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名字空间 Internet安全协议及标准

  6. CryptoAPI功能 • CryptoAPI • 为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口 • CryptoAPI 1.0包含对密码系统的支持 • 密钥交换、管理 • Cryptographic Service Providers • CryptoAPI 2.0 添加了对证书管理的支持 • Cryptographic Service Provider • 系统结构的可插入构件 • 可以通过使用不同的CSP来扩展不同的安全功能 • CAPICOM • 一系列对普通CryptoAPI 2.0功能进行包装的COM类 • 尽管可以直接访问CryptoAPI,但有时使用CAPICOM对象还是要容易些 Internet安全协议及标准

  7. GINA Authenticode Network Interface 用户认证 数据的来源及完整性 认证及通道加密 CryptoAPI SmartCard Based Components 证书管理服务 Certificate Management Services SSPI 编码标准 (PKCS) 安全通道 (Secure Channel) 密码服务 Crypto Services 阅读器 Hardware CSP RSA Based CSP CryptoAPI在系统中的地位 Internet安全协议及标准

  8. CryptoAPI的应用 应用程序 • 加密服务提供者CSP(Cryptographic Service Provider) 安全通道 证书管理服务 Crypto API 证书的存储 SmartCard CSP RSA base CSP Fortezza CSP 密钥数据库 Internet安全协议及标准

  9. CryptoAPI应用注解 • 应用程序不直接和CSP通信 • 应用程序调用CryptoAPI函数, CryptoAPI函数通过CryptoSPI由调用实际的CSP • 由CryptoAPI函数中的一个参数来指明使用哪个CSP进行给定的密码操作。 Internet安全协议及标准

  10. CryptoAPI 2.0的体系结构 Internet安全协议及标准

  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 Internet安全协议及标准

  12. 关于CSP • CSP是真正执行加密工作的独立的模块 • 物理上一个CSP由两部分组成:一个动态链接库,一个签名文件 • 签名文件保证提供者经过了认证,以防出现攻击者冒充CSP。 • 若加密算法用硬件实现,则CSP还包括硬件装置 • Microsoft通过捆绑RSA Base Provider在操作系统级提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中 • Windows 2k以后自带了多种不同的CSP Internet安全协议及标准

  13. 不同类型的CSP • 每个CSP都有一个名字和一个类型。每个CSP的名字是唯一的,而类型则不是。此处着重强调“类型”的特别性。 • 一个CSP 类型代表了一个特定的家族,这个家族决定了以下因素: • 有且仅有一个密钥交换算法; • 有且仅有一个签名算法; • 特定的Key Blob格式; • 特定的数字签名格式; • 特定的密钥推导模式; • 特定的密钥长度; • 特定的分组加密算法的缺省模式 • 若两个或多个应用间欲交换密钥和加密的消息,那么它们必须使用同一类型的CSP Internet安全协议及标准

  14. 预定义的CSP类型 Internet安全协议及标准

  15. CSP的注册 • CSP信息保存在注册表中,由键值访问。 • 在注册表中的提供者键值包括: • CSP 名称 • CSP DLL路径 • 数字签名 • 类型 -- CSP type • Provide Type键值也保存在注册表中 • CSP type • CSP名称 – 必须和上面所说的CSP名称相符 Internet安全协议及标准

  16. CSP的设计 • 共有23个基本密码系统函数由应用程序通过CAPI调用,CSP必须支持这些函数 • 这些函数提供了基本的功能,如:加/解密,导入/导出密钥,散列数据,验证签名等 • CSP的开发 • 可以使用辅助的DLL实现CSP • 辅助的DLL不是CSP的一部分,但是包含CSP调用的函数 • 辅助的DLL必须被签名,并且签名文件必须可用 • 每个DLL在装载库之前被验证签名 Internet安全协议及标准

  17. 密钥库(Key Storage) I Internet安全协议及标准

  18. 密钥库(Key Storage) II • 每个CSP有一个密钥库 • 密钥库用于存储密钥,每个密钥库包括一个或多个密钥容器(Key Containers) • 每个密钥容器中含属于一个特定用户的所有密钥对 • 每个密钥容器被赋予一个唯一的名字;以这个名字做函数CryptAcquireContext 的参数,从而获得指向这个密钥容器的句柄 • 通常为每个用户创建一个默认密钥容器,用用户的登录名作为容器名。可以由任意多个应用程序来使用 • 一个应用程序也可以创建自己的密钥容器和密钥对 Internet安全协议及标准

  19. 密钥库(Key Storage) III • CSP将永久保存每一个密钥容器,包括保存每个密钥容器中的公/私钥对 • 但在一个Session完后CSP将不保存这个Session 在密钥容器中的会话密钥 • 一个Session是指从调用函数CryptAcquireContext到调用函数CryptReleaseContext 期间的阶段。当一个Session结束后,所有的使用hProv句柄创建的会话密钥和Hash值都变为无效 Internet安全协议及标准

  20. 会话密钥 • 在加/解密数据时使用会话密钥 • 会话密钥由应用程序用CryptGenKey或CryptDeriveKey函数创建 • 会话密钥被安全保存在CSP中 • 不同于公私钥对,会话密钥一般更换频繁。应用程序可以以加密的密钥二进制大对象或key blob的形式从CSP中导出会话密钥(用CryptExportKey函数),以供以后使用或传输给其他用户 Internet安全协议及标准

  21. 公钥和私钥对 • 每个用户通常有两对公私钥对。一对用来加密会话密钥,一对用来创建数字签名 Internet安全协议及标准

  22. Key Blob • 在交换密钥时,或密钥需要离开CSP(即导出密钥)时,就存在选择什么样的数据结构存储密钥的问题 • CryptoAPI采用Key Blob数据结构存储离开了CSP内部的密钥 • 当使用CryptExportKey函数从CSP中导出密钥时,Key Blob被创建。之后的某一时间,使用CryptImportKey函数将密钥导入到某个CSP中(通常是另一个不同的机器上的不同的CSP) Internet安全协议及标准

  23. Key Blob(续) • Key Blob有一个标准的信息头和位于信息头之后的一段表示密钥本身的数据组成。通常应用程序不访问Key Blob内部,而是把Key Blob当作一个透明的对象。 • 由于公/私钥对的私钥部分需要绝对保密,所以私钥要用对称加密算法加密。加密Private Key Blob时,除了BLOBHEADER之外的所有部分都要加密。但加密所用的算法和密钥(或密钥参数)不与该Key Blob存储在一起,应用程序负责管理这些信息 Internet安全协议及标准

  24. 密钥的物理特性 • 同时使用同一会话密钥对两个序列的数据进行加密或解密时,要物理上制作一份该会话密钥的拷贝,即一个物理上的会话密钥不得同时用于两个操作。因为每个会话密钥都包含了内部状态信息,若它同时被用于多个操作,会造成混乱 Internet安全协议及标准

  25. 处理的消息格式 Internet安全协议及标准

  26. CryptoAPI函数示例

  27. 语言要求 • 源代码 • #include <wincrypt.h> • #include <cryptuiapi.h> // 当用到系统定义的对话框时 • 链接要求 • 必须同时链接crypt32.lib advapi32.lib • 有些函数需要链接cryptui.lib Internet安全协议及标准

  28. 初始化CSP • CryptAcquireContext • 用来获取特定CSP中特定密钥容器的句柄。返回的句柄用来调用选择的CSP • 进行两项操作: 首先试图找到由各个参数描述的CSP,如果找到CSP,函数接着试图在CSP中找到与指定容器名匹配的密钥容器。这个函数也可用于创建和销毁密钥容器,取决于参数的值。 • CryptReleaseContext • 用于释放从CryptAcquireContext调用返回的句柄 • CryptReleaseContext不删除任何密码系统API对象,仅仅释放指向对象的句柄 Internet安全协议及标准

  29. Internet安全协议及标准

  30. 初始化CSP注解(1) • 如上的代码演示了如何取得默认CSP的默认密钥容器 • 如果对CryptAcquireContext 的调用成功,返回值将非零,并且变量hProv将是一个指向被请求的CSP的句柄。 • 为了给默认的CSP创建一个密钥容器,可以使用如下代码 Internet安全协议及标准

  31. Internet安全协议及标准

  32. 初始化CSP注解(2) • 为了从默认CSP中删除一个已经存在的密钥容器,可以使用像以下的代码 Internet安全协议及标准

  33. 如果CryptAcquireContext调用成功,返回值将非零,hProv指向的密钥容器将被删除,并且该密钥容器不再有效。如果CryptAcquireContext调用成功,返回值将非零,hProv指向的密钥容器将被删除,并且该密钥容器不再有效。 Internet安全协议及标准

  34. Hashing Data • CryptCreateHash, CryptHashData, CryptGetHashParam, 和 CryptDestroyHash • CryptCreateHash • 用于初始化对数据的散列。返回CSP hash对象的句柄, 这个句柄可以用于以后调用CryptHashData,以便散列数据 • CryptGetHashParam • 取回散列值 • CryptDestroyHash • 释放从CryptCreateHash返回的句柄 • 不删除任何密码系统API对象,仅仅释放指向hash对象的句柄 Internet安全协议及标准

  35. Internet安全协议及标准

  36. Internet安全协议及标准

  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); Internet安全协议及标准

  38. Generating Keys • CryptDeriveKey, CryptGenKey, CryptDestroyKey • CryptDeriveKey • 用于从一个特定的口令产生一个密钥 • CryptGenKey • 用于从随机数产生会话密钥或公私钥对 • 如果使用了本函数, 推荐使用CRYPT_EXPORTABLE参数来创建一个可导出的会话密钥。这样该会话密钥可以从一个计算机移到另一个计算机,否则返回的密钥将只存在于特定的计算机/会话 • CryptDestroyKey • 用于释放对密钥对象的句柄 Internet安全协议及标准

  39. Internet安全协议及标准

  40. Internet安全协议及标准

  41. Generating Keys注解 • 上例显示如何使用CryptDeriveKey函数,假定 pPassword 指向一个用户定义的口令,dwPasswordLength是口令的长度 Internet安全协议及标准

  42. En/Decrypting Data • CryptEncrypt, CryptDecrypt: • 可以说整个Crypto API就围绕着这两个函数 • 两个函数的前六个参数相同 • 前两个参数仅仅是密钥的句柄和可选的hash对象 • 第三个参数是一个布尔值,保持为False直到最后一块数据,当处理最后一块数据时必须设为Ture,以便函数对最后一块数据进行一些特殊处理 • 第四和第五个参数仅仅是一个标记值和一个指向将要被加解密的数据的指针 • 第六个参数是一个指向保存在buffer中将被加/解密的字符数的指针 • CryptEncrypt还有第7个参数 • 指定了Block的大小,可用于处理密文长于明文的情况 Internet安全协议及标准

  43. Internet安全协议及标准

  44. En/Decrypting Data注解 • 当用相同的密钥同时加解密两个数据流时,需要小心。相同的物理会话密钥不能用于两个操作,因为每个会话密钥包含内部状态信息,如果同时用于多个操作可能会引起混乱 • 一个相对简单的解决方法是对会话密钥做拷贝 • 拷贝会话密钥可以使用CryptExportKey导出密钥,然后用 CryptImportKey导回。当密钥被导入,CSP将给“新”密钥分配自己的内部内存,在逻辑上和原密钥毫无关系 Internet安全协议及标准

  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 Internet安全协议及标准

  46. 参考资料 • MSDN • From CDROW/DVD • From network Internet安全协议及标准

  47. ChangeLog • 2003.7.10 v1.0 By T.L.Yong • Refine PPT and Fix many bugs. • Initialize from Ding Ruipeng’s PPT Internet安全协议及标准

More Related