密钥和证书
不对称加密使用公共/专用密钥对。对于使用专用密钥加密的数据,只能使用相应的公共密钥进行解密,反之亦然。
顾名思义,公共密钥可广泛使用。相反,专用密钥为特定个人所有。将公共密钥传送至用户的分发机制称为证书。证书一般由证书颁发机构 (CA) 签名,以确认公共密钥来自于要求发送公共密钥的主体。CA 是相互信任的实体。
数字认证的典型实现包括证书签名过程。该过程如图 1 中所示。

图 1. 数字认证过程
图 1 所示的事件序列,如下:
1. | Alice 将一个签名的证书请求发送到 CA,该证书包含有她的姓名、公共密钥以及可能的附加信息。 |
2. | CA 根据 Alice 的请求创建一个消息。CA 使用自己的专用密钥对消息进行签名,以创建一个单独的签名。CA 将消息和签名返回给 Alice。Alice 的证书中包含了消息和签名。 |
3. | Alice 将她的证书发送给 Bob,让他有权访问她的公共密钥。 |
4. | Bob 使用 CA 的公共密钥验证证书的签名。如果证明签名有效,则他会接受证书中的公共密钥作为 Alice 的公共密钥。 |
如同使用任何数字签名一样,任意有权访问 CA 的公共密钥的接收者均可确定是否由特定的 CA 签署证书。这个过程不要求访问任何机密信息。在上述情况中,假设 Bob对 CA 的公共密钥具有访问权。如果 Bob 的CA 证书副本中包含公共密钥,则他就可以访问该密钥。
X.509 数字证书不但包括用户名和公共密钥,而且还包括有关该用户的其他信息。这些证书不仅仅是数字信任结构层次中的跳板。它们使 CA 能够让证书的接收者不仅信任证书主体的公共密钥,而且信任有关证书主体的其他信息。这些证书中的其他信息可能包括电子邮件地址、授权对具有某种价值的文档进行签名,或者对成为一个 CA 并签署其他证书的授权。
X.509 证书和其他多数证书都具有有效期限。证书可以过期并且不再有效。CA 可以出于多种理由而撤消证书。要处理撤销,CA 会维护并分发撤销证书的列表,该列表称为证书取消列表 (CRL)。网络用户访问 CRL 以确定证书的有效性。
证书存储区
证书存储在一个称为证书存储区的安全位置。证书存储区可包括证书、CRL 以及证书信任列表 (CTL)。每位用户都有一个存储用户证书的个人存储区(称为“MY store”)。可以在多个位置物理实现 MY store,这些位置包括注册表、本地或远程计算机、磁盘文件、数据库、目录服务、智能设备或其他位置。
将任何证书存储在 MY store 中的同时,还应当为用户的个人证书(即用于签署和解密特定用户消息的证书)保留这个存储区。
除 MY store 之外,Windows 还具有以下证书存储区:
• | CA and ROOT。该存储区包含证书颁发机构的证书,它们是为用户所信任以向其他用户颁发的证书。操作系统提供了一套受信任的 CA 证书,管理员还可以添加其他的证书。 |
• | Other。该存储区包含用户与之交换签名消息的其他用户的证书。 |
CryptoAPI 提供管理证书的功能。只能通过非托管代码来访问这些 API。同样,CAPICOM 是基于 COM 的 API,用于 CryptoAPI,可通过 COM Interop 进行访问。
更多信息
有关更多信息,请参见 MSDN 网站上的“Cryptography, CryptoAPI, and CAPICOM” (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/cryptography_cryptoapi_and_capicom.asp)。
加密
加密技术用于提供以下功能:
• | 保密性。确保数据不会被公开。通常使用加密实现保密性。加密算法(使用加密密钥)用于将纯文本转换为密码文本,等效的解密算法用于将密码文本重新转换为纯文本。对称的加密算法使用相同的密钥进行加密和解密,而不对称算法使用公共/专用密钥对进行加密和解密。 |
• | 数据完整性。确保数据免受意外或故意(恶意)修改。完整性通常由消息身份验证代码或哈希值提供。哈希值是从数据序列导出的固定长度的数值。哈希值用于验证通过不安全信道发送的数据的完整性。将接收到的数据的哈希值与数据发送时的哈希值进行比较,以确定数据是否被更改。 |
• | 身份验证。确保数据源自特定的用户。数字证书用于提供身份验证。数字签名通常适用于那些明显小于它们所代表的源数据的哈希值。 |
技术选择
• | 希望验证数据在转换过程中没有被篡改时,请使用哈希值。 |
• | 使用关键的哈希值来证明实体知道机密但不来回发送机密,或者使用简单的哈希值来防止转换过程中出现侦听。 |
• | 当要隐藏通过不安全的介质发送数据或者使数据永久稳定时,请使用加密。 |
• | 希望验证个人请求是公共密钥的所有者的身份时,请使用证书。 |
• | 希望加快速度以及双方事先共享密钥时,请使用对称加密。 |
• | 希望通过不安全介质安全地交换数据时,请使用不对称加密。 |
• | 希望身份验证和非拒绝时,请使用数字签名。 |
• | 使用 salt 值(使用加密技术生成的随机数)来防止词典攻击。 |
.NET中的加密
System.Security.Cryptography命名空间提供加密服务,包括数据的安全编码和解码、哈希、随机数生成以及消息身份验证。
.NET Framework 提供多种标准密码算法的实现。因为具有良好定义的继承层次结构,所以可轻松扩展对这些算法,该层次结构包含定义基本算法类型(对称、不对称以及哈希算法)的抽象类和算法类。
表 1:显示 .NET Framework 为之提供实现“现成”类的算法。 | ||
对称算法 | 不对称算法 | 哈希算法 |
DES(数据加密标准) | DSA(数据签名算法) | HMAC SHA1(使用 SHA1 哈希算法且基于哈希的消息身份验证代码) |
TripleDES(三重数据加密标准) | RSA | MAC Triple DES(使用 Triple DES 消息身份验证代码) |
Rijndael | MD5 | |
RC2 | SHA1, SHA256, SHA384, SHA512 |
对称算法支持
.NET 提供以下实现类,这些类提供对称、机密密钥加密算法:
• | DESCryptoServiceProvider |
• | RC2CryptoServiceProvider |
• | RijndaelManaged |
• | TripleDESCryptoServiceProvider |
注 以“CryptoServiceProvider”结尾的类是包装类,它们使用加密服务提供程序 (CSP) 的基本服务;以“Managed”结尾的类在托管代码中实现。
图 2 显示采用继承层次结构的 .NET Framework。算法类型基类(如 SymmetricAlgorithm)是抽象类。一套抽象的算法类派生自抽象类型基类。算法实现类提供了选定算法的具体实现,例如,DES、Triple-DES、Rijndael 和 RC2。

图 2. 对称加密类继承层次结构
不对称算法支持
.NET 通过抽象基类 (System.Security.Crytography.AsymmetricAlgorithm) 提供以下不对称(公共/专用密钥)加密算法:
• | DSACryptoServiceProvider |
• | RSACryptoServiceProvider |
这些算法用于数字签名和加密数据。图 3 显示继承层次结构。

图 3. 不对称加密类继承层次结构
哈希算法支持
.NET 提供以下哈希算法:
• | SHA1, SHA256, SHA384, SHA512 MD5 |
• | HMACSHA (Keyed Hashed algorithm) |
• | MACTripleDES(加密的哈希算法) |
图 4 显示哈希算法类的继承结构层次。

图 4. 哈希加密类继承结构层次
小结
加密是一项构建 Web 应用程序的重要技术。本附录包括了一些证书和加密的基础知识,并简要介绍了一些由 System.Security.Cryptography 命名空间公开的类,使您能更方便地将加密安全解决方案整合到 .NET 应用程序之中。
有关 .NET 中密码技术的详细信息,请在 MSDN 中搜索标题为“.NET Framework Cryptography Model”的网页。