编辑加密应用程序块介绍
Microsoft Enterprise Library 加密应用程序块简化了开发人员如何将加密功能添加到它们的应用程序中去。应用程序可以在多种任务中使用应用程序块,例如加密信息、创建数据的哈希、以及比较哈希值以验证数据是否已被修改。
加密应用程序块有下列特性:
- 减少了处理标准任务时编写重复代码的需要,提供了可以用来解决常规应用程序加密问题的实现。
- 有助于维护一致的加密实践,无论是在应用程序中还是在企业间。
- 使用一致的架构模型跨越提供的不同的功能范围来平滑开发人员的学习曲线。
- 提供了可用于解决常规加密问题的实现。
- 可扩展,支持其他加密提供程序的实现。
常规场景开发人员频率的编写需要加密和哈希能力的应用程序以满足它们组织的安全需求。由应用程序创建并维护的数据,以及配置信息,通常需要加密。另外,用于访问应用程序功能或数据的密码需要被哈希。
加密应用程序块从特定加密提供程序中抽象出应用程序代码以简化开发人员的工作,可以通过修改配置来改变底层提供程序,而不需要修改底层的应用程序代码。
加密应用程序块只支持对称算法。对称算法使用同样的密钥来加密和解密。应用程序块不支持非对称(如公钥)加密,非对称加密使用一个密钥来加密消息,另一个密钥来解密消息。
示例代码下列代码展示了如何加密和解密数据,还展示了如何使用接受一个字符串的重载方法。
string encryptedContentsBase64 = Cryptographer.EncryptSymmetric("symmProvider", "SensitiveData");
// Decrypt the base64 encoded string
string readableString;
readableString = Cryptographer.DecryptSymmetric("symmProvider", encryptedContentsBase64);
Dim encryptedContentsBase64 As String
encryptedContentsBase64 = Cryptographer.EncryptSymmetric("symmProvider", "SensitiveData")
' Decrypt the base64 encoded string
Dim readableString As String
readableString = Cryptographer.DecryptSymmetric("symmProvider", encryptedContentsBase64)
读者要求本指南的目标读者是软件架构师、软件开发人员和策略制定者。要从本指南中获得更多的好处,需要先理解下列技术:
- Microsoft Visual Studio 2005 开发系统
- Microsoft .NET Framework 2.0
系统需求运行加密应用程序块的需求如下:
- Microsoft Windows XP Professional, Windows Server 2003, 或 Windows Vista 操作系统
- Microsoft .NET Framework 2.0 或 3.0
- Microsoft Visual Studio 2005 开发系统(任何下列版本):
- Microsoft Visual Studio 2005 标准版
- Microsoft Visual Studio 2005 专业版
- Microsoft Visual Studio 2005 软件开发人员团队版
- Microsoft Visual Studio 2005 软件测试人员团队版
- Microsoft Visual Studio 2005 软件架构师团队版
- Microsoft Visual Studio 2005 团队套件
加密应用程序块的依赖加密应用程序块依赖于包含在 Enterprise Library 中的其他代码:
- 内核库功能。Enterprise Library 内核提供了如度量和配置这样的服务,并且是所有 Enterprise Library 应用程序块的共享依赖。内核库功能包含在程序集 Microsoft.Practices.EnterpriseLibrary.Common.dll 中。
- ObjectBuilder 子系统,ObjectBuilder 子系统执行所有重复且必要的对象实例的创建和销毁任务,且依然提供了高级的灵活性。Enterprise Library 将 ObjectBuilder 用于如注入配置到程序块的类中和连接度量类到应用程序块这样的任务中。ObjectBuilder 子系统包含在程序集 Microsoft.Practices.ObjectBuilder.dll 。
修改加密应用程序块的配置设置的推荐方法是使用 Enterprise Library 配置控制台。
加密应用程序块的文档和本介绍一起的文档还包括下列主题:
- 用加密应用程序块开发应用程序。本主题描述了如何下载并安装应用程序块以使你可以在你的应用程序中使用它。它也描述了如何为常规操作配置应用程序块。关键场景子主题展示了如何使用应用程序块来完成最典型的加密任务。
- 加密应用程序块的设计。此主题解释了设计中的决定和这些决定背后相关的东西。
- 扩展和修改加密应用程序块。此主题解释了如何创建自己的提供程序来扩展应用程序块和修改源代码。
- 部署和操作。此主题解释了如何部署和更新应用程序块的程序集,还包含了与配置相关的信息。
- 快速入门。此主题解释了如何安装和配置快速入门应用程序,并包含了一系列的漫游,漫游示范了如何将常规的加密操作加入到应用程序中去。
更多信息更多信息,请参见下列资源:
顶部编辑场景和目标
加密应用程序块为解决在开发人员编写需要加密功能的应用程序时所面对的绝大多数常规任务而设计。这些任务已根据
场景进行了组织。每个场景都给出了一个真实世界情况的示例,如认证用户,讨论了情况所需要的加密功能,并展示了完成任务的代码。
根据场景组织这些任务的目的是给代码一些上下文,来代替展示一组独立的方法,而没有它们最好用到哪儿的思想,场景为代码提供了设置,将它放到必须使用加密特性的应用程序的许多开发人员所熟悉的场景中去。
场景如下:
- 配置加密
- 加密数据
- 解密数据
- 获取数据的哈希
- 检查哈希是否配置某些文本
关于每个场景的更多信息,请参见关键场景。
何时使用加密应用程序块将在需要哈希和/或对称加密功能时使用加密应用程序块。可以与包含在应用程序中的加密提供程序一起使用这些功能,或者与自己定制的加密提供程序一起使用。如果数据仅需要加密,而不需要解密(例如,密码),就可以使用哈希。如果数据需要加密也需要解决(例如,传输敏感客户数据),就可以使用对称加密。
同步加密的先决条件是,发送数据的应用程序和接收数据的应用程序必须互相信任。通常,发送者和接受者是同一应用程序时这是正确的。这个限制经常阻止将应用程序块用于跨网络的加密数据。在使用加密应用程序块要考虑的另外二点是如何管理对称加密密钥和将使用哪种哈希或同步加密算法。
管理和分发密钥对称加密在加密和解密数据时使用同样的密钥,发送数据和接收数据的应用程序都必须拥有此密钥。任何其他可以访问此密钥的应用程序也可以加密数据并用密钥解密。这意味着攻击者如果可以访问加密密钥的话,就可以解密加密的数据。而且,攻击者可以删除或破坏密钥文件从而阻止你读取加密的数据。一个密钥文件是一个加密的文本文件,它包含有密钥。必须小心管理共享的密钥。考虑下列指南来保密钥:
- 用访问控制列表(ACL)来保护密钥。只授予需要访问密钥文件的个体必要的权限。
- 在计算机运行在低信任环境中时不要配置计算机允许远程调试。例如,允许匿名访问的 Web 服务器。
加密应用程序块将每个密钥保存在本地计算机中的单独文件中。在配置源中的
节包含了每个密钥文件的绝对路径。例如,在使用默认配置源时,应用程序配置文件包含了每个密钥的绝对路径。为了保护密钥,应用程序块在将它写入文件之前用 DPAPI 对其进行了加密。如果还使用了熵,就必须要保护熵值的存储位置。(熵是使破译文件更加困难的随机数。)例如,可以使用 ACL 来设计包含熵值的文件的授权。如果应用程序需要使用另一种密钥保护方式,如特定的硬件或密钥容器,就必须要修改应用程序块源码来支持需求。关于应用程序块的修改的信息,请参见修改加密应用程序块。
应用程序块没有解决如何安全分发密钥的问题。在自己安全的计算机中安全的分发密钥是相对容易的。其他情况,如在多个合作者之间共享多个密钥,就需要安全的计划。一种方法是使用配置控制台在分发前将密钥导出到密钥文件中。密钥文件使用在导出时提供的密码加密。可以将密钥文件传送到需要密钥的计算机上,然后使用配置控制台导入加密的密钥文件。当导入加密的密钥文件时,配置控制台会提示要求输入用于加密文件的密码。
选择算法如果加密算法被破解或者对暴力破解来说是脆弱的,它将无法提供安全。如果没有测试,定制的加密算法会非常脆弱。做为代替的,使用公开的、众所周知的经受过多年严酷攻击和严格检查的加密算法。
推荐的密码长度随着计算机能力的增长而改变。加密密钥的长度从 128 位到 256 位的范围里在现在而言是安全的。绝大多数现代算法使用的密钥至少是128位长的。
对于哈希算法,推荐使用 SHA256Managed 算法。此算法使用的哈希大小是 256 位。SHA1Managed 哈希算法是 160 位。此算法是可接受的,但不鼓励使用。不现推荐 MD4 和 MD5 算法。
对于对称算法,推荐 AES,也称为 Rijndael。此算法支持的长度为 128、192和 256 位。不再推荐 DES 算法。
顶部编辑用加密应用程序块开发应用程序
本主题描述了如何使用加密应用程序块来开发应用程序。在“输入配置信息”中,它展示了如何修改应用程序块的配置以执行特定的任务。“关键场景”解释了如何将应用程序块用于特定的场景,例如加密数据。本主题假设使用的是原始的应用程序块,没有扩展它。(要学习如何添加功能,请参见扩展加密应用程序块。)
所有应用程序块都带有源代码,在快速入门和配置工具使用前必须编译。要学习如何编译 Enterprise Library 的源代码,请参见构建 Enterprise Library 。
顶部编辑输入配置信息
这些过程解释了如何配置加密应用程序块。与节点相关的属性显示在右边的面板中。
添加加密应用程序块
- 打开配置文件。更多信息,请参见配置应用程序块。
- 右单击应用程序配置,指向 New ,然后单击应用程序块。
- 配置控制台自动添加加密应用程序块节点,以及 HashProviders 和 SymmetricProviders 子节点,并使用了默认配置。
配置加密应用程序块
- (可选的)在右面板中,设置 DefaultHashProvider 属性。在这设置的是,如果应用程序代码没有指定另一个提供程序的话,加密应用程序块将使用的哈希提供程序实例。在下拉列表框中,单击哈希提供程序。默认为无。
- (可选的)在右面板中,设置 DefaultSymmetricCryptoProvider 属性。在此设置的是,如果应用程序代码没有指定另一个提供程序的话,加密应用程序块将使用的对称加密提供程序的实例。在下拉列表框中,单击对称提供程序。默认为无。
配置定制的哈希提供程序
- 单击 Hash Providers ,指向 New ,然后单击 CustomHashProvider 。
- 在右面板中的 Attributes 属性中,单击省略号按钮(...)。
- 在 EditableKeyValueCollectionEditor 对话框中,单击 Add 来添加一个新的名称/值对。
- 在 EditableKeyValueCollectionEditor 对话框的右面板中,输入键的名称和属性的值。
- 按上列方法添加多个名称/值对,然后单击 OK 。
- (可选的)在配置控制台右面板中的 Name 属性节中,修改定制哈希提供程序的名称,默认的名称是 CustomHash Provider 。
- 在右面板的 Type 属性节中,单击省略号按钮(...)。如果程序集文件夹中没有想要的类型,在 TypeSelector 中单击 LoadAssembly,以查找包含想要的类型的程序集。
配置哈希算法提供程序
- 单击 Hash Providers ,指向 New ,然后单击 HashAlgorithmProvider 。
- 在 TypeSelector 对话框中,选择要使用的哈希算法提供程序。如果哈希提供程序没有包含在内,在 TypeSelector 中单击 LoadAssembly 以查找包含想要的类型的程序集。
- (可选的)在配置控制台右面板中的 Name 属性节中,修改哈希算法提供程序的名称,默认的名称是在第2步中选择的类型的名称。
- 设置 SaltEnabled 属性。在下拉列表中,单击 True 或 False 。默认为 False 。
配置定制对称加密提供程序
- 单击 Symmetric Providers ,指向 New ,然后单击 CustomSymmetric CryptographyProvider 。
- 在右面板中的 Attributes 属性节中,单击省略号按钮(...)。
- 在 EditableKeyValueCollectionEditor 对话框中,单击 Add 以添加一个新的名称/值对。
- 在 EditableKeyValueCollectionEditor 对话框的右面板中,输入密钥名称和属性的值。
- 按以上方法添加更多的名称/值对,然后单击 OK 。
- (可选的)在配置控制台的右面板中的 Name 属性节中,修改定制对称加密提供程序的名称。默认的名称为 CustomHash Provider 。
- 在右面板的 Type 属性节中,单击省略号按钮(...)。如果程序集文件夹中没有想要的类型,在 TypeSelector 中单击 LoadAssembly,以查找包含想要的类型的程序集。
配置 DPAPI 对称加密提供程序
- 单击 Symmetric Providers ,指向 New ,然后单击 DPAPISymmetric CryptographyProvider 。
- (可选的)在配置控制台的右面板中的 Name 属性节中,修改 DPAPI 对称加密提供程序的名称。默认名称为 DPAPI Symmetric CryptographyProvider 。
- 设置 ProtectionScope 属性。在下拉列表中,选择 CurrentUser 或 LocalMachine 。
CurrentUser 值的意思是 DPAPI 使用本地用户的配置信息来生成密钥。只有特定用户的账户可以解密已加密的数据。LocalMachine 值的意思是任何运行在机器上的代码都可以访问受保护的密钥;因此,它可以解密任何在 LocalMachine 模式下加密的秘密。要消除这个问题,应用程序代码可以在调用 Encrypt 或 Decrypt 方法时传递一个熵值。熵使得运行在同一台计算机上的一个应用程序难于危害另一应用程序的加密密钥。然而,必须要保护好熵值。如果只是简单的将它保存在不受保护的文件中,攻击者可以访问文件,获取熵值,然后使用它来解密应用程序的数据。应用程序块的配置不包括熵值,这就意味着不能用配置控制台来生成或保存熵值。
配置对称算法提供程序
- 单击 Symmetric Providers ,指向 New ,然后单击 Symmetric AlgorithmProvider 。
- 在 TypeSelector 中,选择要使用的对称算法提供程序。如果没有包含提供程序,单击 TypeSelector 中的 LoadAssembly 来查找包含想要的类型的程序集。默认类型是 RijndaelMananged 。
- 使用 CryptographicKeyWizard 可以导入或生成密钥。更多信息,请参见使用 Cryptographic Key Wizard 。
使用 Cryptographic Key Wizard使用 Cryptographic Key Wizard ,你可以:
- 创建新的密钥。
- 使用已存在的 DPAPI 保护的密钥文件。
- 导入密码保存的密钥文件。
Enterprise Library 使用 DPAPI 来保护密钥。可以使用 Cryptographic Key Wizard 来创建密钥,每个密钥保存在独立的文件中,并使用 DPAPI 保护。当创建密钥时,可以选择机器模式或者用户模式来限制对密钥的访问。
在下列情况下使用机器模式:
- 应用程序运行在自己专用的服务器,服务器上没有其他应用程序。
- 多个应用程序运行在同一服务器上,这些应用程序能够共享敏感信息。
如果在共享主机环境中运行应用程序,并确保应用程序的敏感数据对服务器上的其他应用程序来说是不可访问的时使用用户模式。在这种情况下,每个应用程序都将以单独的标识运行,应用程序的资源,如文件和数据库,都限于那个标识。
注意:如果在机器模式下使用 DPAPI ,加密的字符串将专用于特定的机器,所以必须在每个机器上生成加密的数据。不要在服务器农场或集群中的服务器间复制加密的数据。
下面的过程描述了如何使用 Cryptographic Key Wizard。
生成一个新的密钥
- 选择 Create a new key ,然后单击 Next 。
- 输入要使用的十六进制密钥或者单击 Generate 生成一个新的密钥。单击 Next 。
- 选择要保存密钥文件的位置。输入位置或者单击省略按钮(...)并选择位置。单击 Next 。
- 选择 Usermode 或者 Machinemode。用户模式使用当前登录的用户的证书加密密钥。在机器模式中,任何登录的用户都可以加密和解密密钥。单击 Finish 。
- Key 属性将出现在配置控制台的右面板中。单击省略号按钮(...)可再次使用 Cryptographic Key Wizard 生成一个不同的密钥。
使用已存在的受 DPAPI 保护的密钥文件
- 选择 Use an existing DPAPI-protected key file,然后单击 Next 。
- 输入密钥文件的位置。文件必须包含与所使用的同样的算法类型相关联的密钥。例如,如果配置了 RijndaelManaged 类型的算法,导入的密钥也就必须与 RijndaelManaged 类型算法相关联。更多信息,请参见使用提示。输入位置或者单击省略号按钮(...)并选择位置。单击 Next 。
- 选择 Usermode 或 Machinemode 之一。用户模式使用当前登录的用户的证书加密密钥。在机器模式中,任何登录的用户都可以加密和解密密钥。单击 Finish 。
- Key 属性将出现在配置控制台的右面板中。单击省略号按钮(...)可再次使用 Cryptographic Key Wizard 生成一个不同的密钥。
导入一个受密码保护的密钥文件
- 选择 Import a password-protected key file,然后单击 Next 。
- 输入密钥文件的位置。输入位置或者单击省略号按钮(...)并选择位置。文件必须包含与当前所使用的同样的算法类型相关联的密钥。例如,如果配置了 RijndaelManaged 类型的算法,导入的密钥也就必须与 RijndaelManaged 类型算法相关联。更多信息,请参见使用提示。输入用于加密文件的密码。单击 Next 。
- 选择 Usermode 或 Machinemode 之一。用户模式使用当前登录的用户的证书加密密钥。在机器模式中,任何登录的用户都可以加密和解密密钥。单击 Finish 。
- Key 属性将出现在配置控制台的右面板中。单击省略号按钮(...)可再次使用 Cryptographic Key Wizard 生成一个不同的密钥。
使用提示
导入和保存密钥时考虑以下几点:
- 在为算法导入密钥时,必须选择为同样算法类型导出的密钥文件。如果选择了一个其他算法类型的密钥,在应用程序运行时将会出现异常。
- 配置控制台在配置源的
节中保存每个密钥文件的绝对路径。例如,在使用默认的配置源时,应用程序配置文件包含了密钥文件的绝对路径。如果在另一台计算机中部署应用程序,必须复制密钥文件到同样的绝对路径,或者更新计算机的配置源中的 节以反映新的位置。
顶部编辑加密应用程序块的源的模式
本主题列出了用于配置加密应用程序块的 XML 元素和属性。可以手工编辑 XML 数据,但是 Enterprise Library 配置控制台极大的简单了此任务。如果选择手工编辑 XML ,请使用包含在本主题中的模式信息。
配置文件有下列节头声明。
<section name="securityCryptographyConfiguration"
type="Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Configuration.CryptographySettings,
Microsoft.Practices.EnterpriseLibrary.Security.Cryptography, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null" />
节处理器声明包含了配置设置节的名称和处理在配置节中的配置数据的节处理器类的名称。配置设置节的名称是
securityCryptographyConfiguration ,节处理器类的名称是
CryptographySettings。它在
Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Configuration 命名空间中。
securityCryptographyConfiguration 元素 此
securityCryptographyConfigration 元素指定了加密应用程序块的配置。此元素是必须的。
属性和子元素下面的节描述了
securityCryptographyConfiguration 元素的属性和子元素。
属性表1 列出了
securityCryptographyConfiguration 元素的属性
表1:securityCryptographyConfiguration 的属性| 属性 | 描述 |
|---|
| defaultHashInstance | 如果在代码中没有指定,所使用的哈希实例。此属性是可选的。 |
| defaultSymmetricCryptoInstance | 如果在代码中没有指定,所使用的对称密钥实例。此属性是可选的。 |
hashProviders 子元素hashProviders 元素是
securityCryptographyConfiguration 元素的一个子元素,它列出了可以被应用程序所使用的哈希提供程序。此元素是可选的。
add 子元素add 元素是
hashProvider 元素的一个子元素。
add 元素添加提供程序的名称。此元素是可选的。可以有多个
add 元素。
属性表 2 列出了
add 元素的属性
表 2 :add 的属性| 属性 | 描述 |
|---|
| name | 哈希提供程序的名称。名称在节中必须唯一。此属性是必需的。 |
| type | 派生自 HashAlgorithmProvider 类的类的类型名称。此属性是必需的。 |
| algorithmType | 派生自 HashAlgorithm 类的类的类型名称。此属性是必需的。 |
| saltEnabled | 指定 salt 是否可用,可能的值是 true 和 false 。此属性是必需的。 |
| protectedKeyFilename | 指定绝对路径和包含加密的密钥的文件的文件名。此属性对于有密钥的哈希算法是必需的。 |
| protectedKeyProtectionScope | 指定是使用机器存储来存储秘密还是使用用户存储。可能的值是 CurrentUser 和 LocalMachine。此属性对于有密钥的哈希算法是必需的。 |
symmetricCryptoProviders 子元素symmetricCryptoProviders 元素是
securityCryptographyConfiguration 元素的子元素。它列出了可被应用程序使用的对称加密提供程序。此元素是可选的。
add 子元素add 元素是
symmetricCryptoProviders 元素的一个子元素。
add 元素添加一个哈希提供程序的名称。此元素是可选的。可以有多个
add 元素。
属性表3列出了
add 元素的属性
表 3 :add 的属性| 属性 | 描述 |
|---|
| name | 对称加密提供程序的名称。名称在节中必须唯一。此属性是必需的。 |
| type | 派生自 SymmetricAlgorithmProvider 类或者 DpapiSymmetricCryptoProvider 类的类的类型名称。此属性是必需的。 |
| algorithmType | 派生自 SymmetricAlgorithm 类的类的类型名称。此属性是必需的。( 对 DPAPI 提供程序无效。) |
| protectedKeyFilename | 指定绝对路径和包含加密的密钥的文件的文件名。此属性是必需的。( 对 DPAPI 提供程序无效。) |
| protectedKeyProtectionScope | 指定是使用机器存储来存储秘密还是使用用户存储。可能的值是 CurrentUser 和 LocalMachine。此属性是必需的。( 对 DPAPI 提供程序无效。) |
顶部编辑添加应用程序代码
加密应用程序块设计以支持对称加密和哈希的常规场景。在添加应用程序代码时,参考关键场景中的场景,然后选出最适合的一种。使用展示在这儿的和场景一起的代码或者根据需要修改它。
准备应用程序
- 添加一个到加密应用程序块程序集的引用。在 Visual Studio 中,右单击解决方案浏览器中的项目节点,然后单击添加引用。单击浏览定位到 Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll 程序集。选择程序集,然后单击确定。
- 根据同样的步骤,设置到 Enterprise Library Common 程序集的引用,Microsoft.Practices.EnterpriseLibrary.Common.dll,以及到 ObjectBuilder 程序集的引用,Microsoft.Practices.EnterpriseLibrary.ObjectBuilder.dll。
- (可选的) 要不带完整的精确的元素引用使用来自加密应用程序块的元素,可以添加下列的 using 语句(C#)或者 Imports 语句(Visual Basic)到源代码文件的顶部。
C#
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
Visual Basic
Imports Microsoft.Practices.EnterpriseLibrary.Security.Cryptography
注意:对于 Visual Basic 项目,可以使用项目设计器的引用页来管理引用和导入命名空间。要访问引用页,在解决方案浏览器中选择项目节点,在项目菜单中单击属性。在项目设计器出现时,单击引用标签。
4. 下一步,添加应用程序代码。
此节中的场景示范了如何合并这些步骤到应用程序中去。
顶部编辑关键场景
此主题描述了开发人员在应用程序中提供加密功能时必须解决的绝大多数常规情况。每个场景都解释了任务,描述了任务可能发生的真实世界的情况,并且包括了示范如何使用加密应用程序块来完成任务的代码。场景如下:
- 加密秘密。此场景示范了怎样使用对称算法提供程序加密秘密。
- 解密秘密。此场景示范了怎样使用对称算法提供程序解密已加密的秘密。
- 获得文本的哈希。此场景示范了怎样从数据中生成哈希值。
- 验证哈希值是否与某些文本匹配。此场景示范了怎样比较纯文本数据和以前从数据中生成的哈希值,以验证从生成初始的哈希以来数据没有被改变过。
顶部编辑用对称提供程序加密数据
一个常规加密任务是使用对称提供程序加密数据。当应用程序有要保证机密的数据时,也许要进行此任务。
典型目标在此场景中,要使用对称提供程序来加密提供的数据。对称提供程序的输出是加密的数据。
解决方案调用 Cryptographer 类的静态 EncryptSymmetric 访求的适当重载(字符串或字节数组),指定要使用的对称提供程序的名称和要加密的数据。
快速入门对于如何使用 EncryptSymmetric 方法加密数据的扩展示例,请参见漫游:加密秘密。
使用 EncryptSymmetric下列代码展示了如何使用 EncryptSymmetric 方法来加密字符串形式的数据。此重载返回的是 base64 编码的字符串。
C#
string encryptedContentsBase64 = Cryptographer.EncryptSymmetric("symmProvider", "password");
Visual Basic
Dim encryptedContentsBase64 As String
encryptedContentsBase64 = Cryptographer.EncryptSymmetric("symmProvider", "password")
下列代码展示了如何使用 EncryptSymmetric 方法加密字节数组中的数据。此重载返回一个字节数组。
C#
byte[] valueToEncrypt = Encoding.Unicode.GetBytes("password");
byte[] encryptedContents = Cryptographer.EncryptSymmetric("symmProvider", valueToEncrypt);
// Clear the byte array memory that holds the password.
Array.Clear(valueToEncrypt, 0, valueToEncrypt.Length);
Visual Basic
Dim valueToEncrypt = Encoding.Unicode.GetBytes("password")
Dim encryptedContents As Byte() = Cryptographer.EncryptSymmetric("symmProvider", valueToEncrypt)
' Clear the byte array memory that holds the password.
Array.Clear(valueToEncrypt, 0, valueToEncrypt.Length)
使用提示加密数据时考虑下面几点:
- 确定在 Enterprise Library 配置控制台中配置了合适的对称提供程序。
- 敏感数据尽可能快的从内存中清除。留下未加密的数据在内存中会使数据面临安全威胁。要注意的是,内存中的数据也有可能到硬盘上,因为操作系统会将数据写入一个交换文件中。如果计算机崩溃,操作系统会将内存中的内容保存到磁盘中。
顶部编辑用对称加密提供程序解密数据
如果使用对称加密提供程序加密数据,通常不得不使用同样的提供程序解密数据。
典型目标在此场景中,要使用对称提供程序解密提供的数据。对称提供程序的输出是没有加密的数据。
解决方案调用
Cryptographer 类中静态方法
DecryptSymmetric 的适当重载(字符串或字节数组)来执行解密,提供使用的配置的对称提供程序的名称以及要解密的数据。
快速入门对于使用
DecryptSymmetric 方法解密数据的扩展示例,请参见漫游:解密秘密。
使用 DecryptSymmetric下列代码展示了如何使用
DecryptSymmetric 方法解密 base64 编码字符串格式的数据。
C#
string encryptedContentsBase64 = Cryptographer.EncryptSymmetric("symmProvider", "password");
// Decrypt the base64 encoded string.
string readableString;
readableString = Cryptographer.DecryptSymmetric("symmProvider", encryptedContentsBase64);
Visual Basic
Dim encryptedContentsBase64 As String
encryptedContentsBase64 = Cryptographer.EncryptSymmetric("symmProvider", "password")
' Decrypt the base64 encoded string.
Dim readableString As String
readableString = Cryptographer.DecryptSymmetric("symmProvider", encryptedContentsBase64)
下列代码展示了如何使用 DecryptSymmetric 方法解密字节数组格式的数据。
C#
byte[] valueToEncrypt = Encoding.Unicode.GetBytes("password");
byte[] encryptedContents = Cryptographer.EncryptSymmetric("symmProvider", valueToEncrypt);
// stringToDecrypt contains an encrypted string.
byte[] decryptedContents = Cryptographer.DecryptSymmetric("symmProvider", encryptedContents);
string plainText = (new UnicodeEncoding()).GetString(decryptedContents);
Visual Basic
Dim valueToEncrypt = Encoding.Unicode.GetBytes("password")
Dim encryptedContents As Byte() = Cryptographer.EncryptSymmetric("symmProvider", valueToEncrypt)
' stringToDecrypt contains an encrypted string.
Dim decryptedContents As Byte() = Cryptographer.EncryptSymmetric("symmProvider", stringToDecrypt)
Dim plainText As String = (New UnicodeEncoding).GetString(decryptedContents)
使用提示确认在 Enterprise Library 配置控制台中配置了合适的对称提供程序。
顶部编辑获取哈希值
可能要获取哈希值的一个例子是有一个不想通过网络传输的密码时。
典型目标在此场景中,目标是使用应用程序块从输入数据中生成一个哈希值。
解决方案调用
Cryptographer 类中的静态方法
CreateHash 的适当重载(字符串或字节数组)来获取哈希,指定被哈希的数据并提供配置的哈希提供程序的名称。
快速入门对于如何使用
CreateHash 方法的一个扩展示例,请参见漫游:获取一个哈希值。
使用 CreateHash下列代码展示了如何在字符串格式的数据上使用
CreateHash 方法。
C#
byte[] valueToHash = (new UnicodeEncoding()).GetBytes("password");
byte[] generatedHash = Cryptographer.CreateHash("hashProvider", valueToHash);
// Clear the byte array memory.
Array.Clear(valueToHash, 0, valueToHash.Length);
Visual Studio
Dim valueToHash = (New UnicodeEncoding).GetBytes("password")
Dim generatedHash As Byte() = Cryptographer.CreateHash("hashProvider", valueToHash)
' Clear the byte array memory.
Array.Clear(valueToHash, 0, valueToHash.Length)
使用提示在创建一个哈希值时请考虑以下几点:
- CreateHash 方法有二个重载。重载的使用依赖于是从字符串还是从字节数据创建哈希。
- 确认已在 Enterprise Library 配置控制台中指定了哈希提供程序。
- 敏感数据应该尽快从内存中清除。在内存中保留未加密的敏感数据会暴露数据到安全风险中。要注意的是在内存中的数据也可能会放到硬盘上,因为操作系统会将数据写到一个交换文件。还有,如果系统崩溃,操作系统会转储内存中的数据到磁盘中。
顶部编辑校验哈希值是否与某些文本匹配
要检查一个哈希是否与某些文本匹配的一个例子是不得不验证数据在网络传输中没有被修改。在这种情况下,数据的哈希值保存在服务器上,当数据到达服务器时,它将与哈希值进行比较。
典型目标在此场景中,目标是比较纯文本和以前生成了哈希值的数据,以验证数据没有被修改。
解决方案确定匹配的数据类型,可以转换纯文本到字节数组,或者转换哈希数据到字符串。调用
Cryptographer 类的静态方法
CompareHash 的适当重载(字符串或字节数组)以获得哈希,指定哈希的数据以及要比较的以前生成的哈希,还有使用的已配置的哈希提供程序的名称。
快速入门如何使用
CompareHash 方法来到期一个对应一个用户标识的令牌的扩展示例,请参见漫游:检查哈希是否匹配某些文本。
使用 CompareHash下列代码展示了如何在字符串格式的数据上使用 CompareHash 方法。
C#
// generatedHash contains a hash value for a previously hashed string.
byte[] stringToCompare = (new UnicodeEncoding()).GetBytes("TestValue");
bool comparisonSucceeded = Cryptographer.CompareHash("hashProvider", stringToCompare, generatedHash);
Visual Basic
' generatedHash contains a hash value for a previously hashed string.
Dim stringToCompare = (New UnicodeEncoding).GetBytes("TestValue")
Dim comparisonSucceeded As Boolean = Cryptographer.CompareHash( "hashProvider", stringToCompare, generatedHash)
使用提示确认已在 Enterprise Library 配置控制台中指定了哈希提供程序。
顶部编辑加密应用程序块的设计
加密应用程序块包含了对下列特性的支持:
- 加密算法
- 哈希算法
- 多种加密提供程序
- 加密提供程序的其他实现
- 使用 DPAPI 的密钥保护
设计目标加密应用程序块被设计为以达到下列目标:
- 为通常需要的功能提供简单且直观的接口。
- 封装用于执行绝大多数常规应用程序加密任务的逻辑。
- 为常规加密任务提出了一个标准一致的模型。
- 确定应用程序块是可扩展的。
- 确定与手工编写加密代码以完成同样的功能相比对性能的影响最小或者很小。
- 提供了一种密钥保护模型,可以定制来满足组织安全需求。
设计亮点图1示例了加密应用程序块的设计。
 加密应用程序块的设计 |
加密应用程序块分隔了如何实现加密功能和应用程序如何使用它们的决定。应用程序块被设计为修改加密提供程序的行为而不用修改应用程序代码。
Cryptographer 类是一个介于客户代码和加密应用程序块加密功能之间的外观。客户代码调用
Cryptographer 类的静态方法创建哈希、比较哈希、加密数据和解密数据。每个静态方法使用了一个工厂类,并传递配置源到工厂类的构造函数。工厂使用配置数据来决定要创建的提供程序的类型。
DpapiCryptographer 类使用 DPAPI 来加密和解密数据。DPAPI 使用登录凭证来加密数据。登录凭证可能是用户的登录凭证,也可以是本地计算机的登录凭证。如果使用了本地计算机的登录凭证,DPAPI 允许运行在那些凭证下的所有应用程序解密数据。要消除此影响,可以使用附加秘密来保护数据。这附加的秘密名叫熵。
DpapiCryptographer 类有接受熵值的
Encrypt 和
Decrypt 方法的重载。
注意:开发人员必须小心的保存熵值。如果它简单的保存为未保护的文件,攻击者将可以访问文件,获取熵的值,然后使用它来解密应用程序的数据。
SymmetricCryptographer 类封装了派生自抽象基类
SymmetricAlgorithm 的提供程序的实现,基类在 .NET Framework 的
System.Security.Cryptography 命名空间中。这意味着可以和任何 .NET Framework 对称算法一起使用
SymmetricCryptographer ,如 Rijndael 对称加密算法。应用程序块使用 DPAPI 加密和解密对称算法密钥。
密钥管理模型在 Enterprise Library - January 2006 中,可以使用配置控制台来选择加密提供程序的算法。如果算法需要密钥,配置控制台将提示选择一个已存在的密钥或者生成一个密钥。在创建一个新的密钥时,配置控制台使用加密应用程序块加密密钥,然后保存加密的密钥到它自己的文本文件中。应用程序块使用 DPAPI 加密密钥。在应用程序运行时,应用程序块使用 DPAPI 解密密钥,然后使用密钥加密或解密数据。
加密应用程序块设计时组件包含了加密密钥向导。使用向导可以创建一个新的密钥也可以使用一个已存在的密钥。可以选择一个包含已用 DPAPI 加密的密钥的文件来使用已存在的密钥。通常,此是一个以前用配置控制台生成的密钥。
也可以使用配置控制台导出已存在的密钥到一个文件中。在导出密钥时,配置控制台提示你提供一个用于加密密钥的密码。应用程序块
KeyManager 类调用
KeyReaderWriter 类加密密钥并生成文件。文件包含一个版本号、salt 值和已加密的密钥。
最后,可以使用加密密钥向导导入以前导出的密钥。这意味着,如果必须分发密钥到多个计算机,就可以使用配置控制台导出密钥到加密的文本文件,传送密钥文件到需要密钥的计算机,然后使用配置控制台再导入加密的文本文件。在导入加密的密钥文件时,配置控制台将提示需要用于加密文件的密码。
顶部编辑用于简单加密功能的设计
应用程序中的加密可以用多种方式实现。通常,开发人员必须重复代码以完成常规的任务。为了满足组织的需要, 他们可能不得不熟悉实现加密的多种方法。加密应用程序块为简化和抽象应用程序中加密的实现而设计。
设计内涵可以确定的是应用程序块在以下设计决定中的结果是简化了访问加密功能的任务:
- 它仅暴露少量需要开发人员理解的方法。
- 它将使用一致的数据类型接收和返回数据。
- 它将支持常规算法。
下面的章节描述了这些决定。
少量的方法应用程序块支持少量的简化最常用加密任务的方法。它提供了一个定义了应用程序块支持的静态方法集合的
Cryptographer 类。这些方法如下:
- CreateHash
- CompareHash
- EncryptSymmetric
- DecryptSymmetric
一致的数据类型每个公共方法都有二个重载。其中一个重载接受字符串类型的参数;另一个重载接受字节数组类型的参数。例如,下列代码片断展示了
CreateHash 的二个重载。
C#
public static byte">"> CreateHash(string hashInstance, byte[ plainText)
public static string CreateHash(string hashInstance, string plaintext)
Visual Basic
Public Shared Function CreateHash(ByVal hashInstance As String, ByVal plainText As Byte()) As Byte()
Public Shared Function CreateHash(ByVal hashInstance As String, ByVal plainText As String) As String
常规算法加密应用程序块包含了二个对称提供程序的实现。
DpapiSymmetricCryptoProvider 使用 DPAPI 来提供加密服务。开发人员可以使用
SymmetricAlgorithmProvider 来选择和配置包括 .NET Framework 在内的对称算法。
加密应用程序块包含了二个哈希提供程序的实现。
KeyedHashAlgorithmProvider 允许开发人员配置需要一个已生成的密钥的包括 .NET Framework 在内的哈希算法。开发人员也可以使用
HashAlgorithmProvider 来选择和配置不需要生成的密钥的哈希算法。二个提供程序都允许开发人员在哈希前确认随机字符串(就是所说的熵值)已生成,并且预先考虑了纯文本。决策者使用熵值来保存密码,因为它们显著的减缓了字典攻击,并且字典中的每个实体都必须使用每个熵值进行哈希。
注意:
推荐使用 SHA256 哈希算法,SHA1Managed 算法虽然可以接受,但已不再建议使用。不再推荐使用 MD4 和 MD5 算法。
对于对称加密,当前推荐使用 AES ,不再推荐 DES 。
顶部编辑用于算法抽象的设计
使用加密应用程序块,开发人员可以使用逻辑名称来由不同的方法引用算法,例如 "Hash Provider" 或者 "Password Encryption"。
设计意图逻辑命名算法抽象隐含了关于应用程序块的设计的二个方面:
- 用于逻辑名称的 API 的支持
- 对 Enterprise Library 内核的依赖
用于逻辑名称的 API 的支持每个
Cryptographer 的方法都接受包含逻辑算法名称的字符串。对象使用此逻辑名称来定位包含在配置文件中的适当算法信息。
对配置的依赖因为算法信息是在配置文件中,加密应用程序块就必须能够读取配置信息。结果是,
Cryptographer 类需要 Enterprise Library 内核并使用它来从配置文件中定位并读取必要的信息。
顶部编辑扩展和修改加密应用程序块
在它的原始状态中,加密应用程序块能很好的用于典型的加密场景。然而,许多时候都不得不定制某些加密应用程序块的行为以更好的适应应用程序的特定需求。有二种方法可以定制应用程序块,扩展和修改。
扩展加密应用程序块通过指定的扩展点扩展加密应用程序块。典型的,这些扩展点是由你编写的自定义的类,这些类实现了特定接口或者从一个抽象类中派生。因为这些定制的类已存在于应用程序的空间中,所以不需要修改或重建应用程序块。另一种选择是,使用配置设置指定扩展。
现在,可以创建新的、那些由应用程序块提供的提供程序之外的加密提供程序来扩展应用程序块。要这样做,实现包含在应用程序块中的接口。为了帮助你使用定制的提供程序,可以使用 Enterprise Library 配置控制台来指定定制的哈希和对称提供程序。更详细的信息,请参见扩展加密应用程序块。
修改加密应用程序块修改加密应用程序块要对应用程序块的源代码进行修改。这些修改可能或不可能需要相关配置的改变。因为是对源代码的修改,所以在修改起作用之前必须重建应用程序块。还必须准备处理支持和版本问题。要学习更多的信息,请参见修改加密应用程序块。
顶部编辑扩展加密应用程序块
加密应用程序块为用于不同的应用程序和成为通用应用程序块而设计。扩展点让你适配应用程序块以满足任何特定应用程序的需要。可以添加自定义的加密提供程序来扩展应用程序块的功能。典型的,这些自定义的提供程序是第三方的加密提供程序。
扩展加密应用程序块- 创建新的自定义类并添加它到项目中。
- 确认类实现了要求的接口、构造函数和方法。
- 在 Enterprise Library 控制台中创建一个通用对象。
- 指定自定义类的类型名。
- 个性对象的属性能指定任何自定义的配置属性。
创建自定义的哈希算法提供程序1.创建一个新类,然后添加它到项目中。
2.(可选的) 要不带完整的精确的元素引用使用来自加密应用程序块的元素,可以添加下列的 using 语句(C#)或者 Imports 语句(Visual Basic)到源代码文件的顶部。
C#
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Configuration;
Visual Basic
Imports Microsoft.Practices.EnterpriseLibrary.Common.Configuration
Imports Microsoft.Practices.EnterpriseLibrary.Security.Cryptography
Imports Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Configuration
注意:对于 Visual Basic 项目,可以使用项目设计器的引用页来管理引用和导入命名空间。要访问引用页,在解决方案浏览器中选择项目节点,在项目菜单中单击属性。在项目设计器出现时,单击引用标签。
3.指定类实现 IHashProvider。
4.添加类的属性 ConfigurationElementType,指定属性的参数为 CustomHashProviderData 的类型。
C#
[ConfigurationElementType(typeof(CustomHashProviderData))]
public class MyHashProvider : IHashProvider
Visual Basic
<ConfigurationElementType(GetType(CustomHashProviderData))> _
Public Class MyHashProvider: Implements IHashProvider
5.添加拥有 NameValueCollection 类型的参数的构造函数。
C#
public MyHashProvider(NameValueCollection attributes)
{
}
Visual Basic
Public Sub New(ByVal attributes As NameValueCollection)
End Sub
6.添加 CreateHash 和 CompareHash 方法到类中,然后实现需要的行为。
C#
public byte[] CreateHash(byte[] plaintext)
{
}
public bool CompareHash(byte[] plaintext, byte[] hashedtext)
{
}
Visual Basic
Public Function CreateHash(ByVal plaintext As Byte()) As Byte()
End Function
Public Function CompareHash(ByVal plaintext As Byte(), ByVal hashedtext As Byte()) As Boolean
End Function
创建自定义对称加密算法提供程序
1.创建一个新的类,然后添加它到项目中。
2.(可选的) 要不带完整的精确的元素引用使用来自加密应用程序块的元素,可以添加下列的 using 语句(C#)或者 Imports 语句(Visual Basic)到源代码文件的顶部。
C#
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Configuration;
Visual Basic
Imports Microsoft.Practices.EnterpriseLibrary.Common.Configuration
Imports Microsoft.Practices.EnterpriseLibrary.Security.Cryptography
Imports Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Configuration
注意:对于 Visual Basic 项目,可以使用项目设计器的引用页来管理引用和导入命名空间。要访问引用页,在解决方案浏览器中选择项目节点,在项目菜单中单击属性。在项目设计器出现时,单击引用标签。
3.指定类实现 ISymmetricCryptoProvider。
4.添加类属性 ConfigurationElementType,指定 CustomSymmetricCryptoProviderData 的类型为属性的参数。
C#
[ConfigurationElementType(typeof(CustomSymmetricCryptoProviderData))]
public class MyCustomEncryptionProvider : ISymmetricCryptoProvider
Visual Basic
<ConfigurationElementType(GetType(CustomSymmetricCryptoProviderData))> _
Public Class MyCustomEncryptionProvider: Implements ISymmetricCryptoProvider
5.添加以 NameValueCollection 为参数的构造函数。
C#
public MockCustomSymmetricProvider(NameValueCollection attributes)
{
}
Visual Basic
Public Sub New(ByVal attributes As NameValueCollection)
End Sub
6. 添加 Encrypt 和 Decrypt 方法到类中,并实现需要的行为。
C#
public byte[] Encrypt(byte[] plaintext)
{
}
public byte[] Decrypt(byte[] ciphertext)
{
}
Visual Basic
Public Function Encrypt(ByVal plaintext As Byte()) As Byte()
End Function
Public Function Decrypt(ByVal ciphertext As Byte()) As Byte()
End Function
顶部
编辑修改加密应用程序块
加密应用程序块为用于不同的应用程序和成为通用应用程序块而设计。扩展点让你适配应用程序块以满足任何特定应用程序的需要。然而,如果要添加新的特性到应用程序块,就要因此而修改源代码(应用程序块包含了源代码和二进制。)
修改加密应用程序块的建议在修改源代码时,请使用以下最佳实践:
- 通过阅读文本中的加密应用程序块设计节理解应用程序块是如何工作的。
- 如果大量修改了代码或者要将应用程序块自定义版本和原始版本一起使用,考虑修改加密应用程序块的命名空间。需要注意的是,改变应用程序块的命名空间要求更新所有其他应用程序块以及使用加密应用程序块的应用程序以适应新的命名空间。
- 使用强名称。强名称允许程序集被唯一标识、版本化和以及完整性验证。这将不得不生成自己的密钥对以签名应用程序块的修改版本。更多信息,请参见强命名程序集和版本手册。另一种选择是,可以选择不签名定制的版本,而是做为弱命名来引用。
- 为了使修改起作用,必须重新编译代码。打开加密应用程序块的 Visual Studio 解决方案文件,然后重建整个解决方案。
修改密钥管理代码Enterprise Library 实现了基于 DPAPI 的方法来进行密钥管理。可以使用此实现,或者根据它的模型适配代码以满足组织的密钥管理需求。使用下列指南来修改应用程序块源代码以实现自定义的密钥管理解决方案:
- 修改 KeyManager 类。应用程序块运行时使用 KeyManager 类来读取和写入密钥。此类放置在 Security.Cryptography 项目中。
- 修改或替换 Cryptographic Key Wizard 的源代码。此向导是应用程序块设计时组件的一部分。可以在 Security.Cryptography.Configuration.Design 项目中找到用于向导的源代码。
- 修改运行加密密钥向导的设计时源代码。配置控制台在添加加密的哈希算法提供程序或者添加一个对称算法提供程序到应用程序配置中时运行此向导。可以在 AddHashAlgorithmProviderNodeCommand 类和 AddSymmetricAlgorithmProviderNodeCommand 类中找到运行向导的代码。可以在 Security.Cryptography.Configuration.Design 项目中找到这些类的源代码。
更多信息相关信息,请参见下列资源:
顶部编辑部署和操作
管理员的需要确认加密应用程序块的初始部署是有计划且可管理的,以及确认后来的部署更新仅对已存在的使用应用程序块的应用程序产生最少的影响。本主题将解决这些和其他管理主题:
- 部署加密应用程序块
- 更新加密应用程序块
- 度量加密应用程序块
注意:在加密应用程序块部署到任何计算机以前,必须先安装 .NET Framework。
顶部编辑部署加密应用程序块
加密应用程序块以多个程序集组成。每个属于加密应用程序块的程序集都有一个以
Microsoft.Practices.EnterpriseLibrary.Security.Cryptography 开头的文件名。另外,应用程序块依赖于通用程序集和
ObjectBuilder 子系统。使用加密应用程序块的应用程序可以部署在下列二个配置的任意一个中:
- 部署为在应用程序文件夹层次中的私有程序集。
- 部署为任意文件系统位置或者在全局程序集缓存中做为共享程序集。
部署加密应用程序块为私有程序集如果应用程序没有使用来自全局程序集缓存中的可用服务,加密应用程序块就可能被部署在应用程序目录结构中。这简化了部署,因为在目标机器上可以使用
xcopy 命令来安装整个应用程序,包含加密应用程序块程序集。如果在同一计算机上的多个应用程序使用加密应用程序块,可以在每个应用程序目录层次中安装一个程序集的副本。这允许每个应用程序的程序集副本可以被单独更新。关于强命名 Enterprise Library 程序集的信息,请参见强命名 Enterprise Library 程序集。
部署加密应用程序块为共享程序集可以签名一个强名称到加密应用程序块程序集。在 Visual Studio .NET 和 .NET Framework SDK 中都包含有进行强命名的工具。在程序集被强命名后,它们就可以被部署在一个共享的位置并由多个应用程序使用。可以选择部署程序集在任何文件系统位置,并在每个使用加密应用程序块的应用程序的配置文件中添加
<codebase> 元素以指定程序集的位置。
更多类似的场景是在全局程序集缓存部署共享程序集。在此场景中,所有在计算机上的应用程序都可以使用程序集而不用进行任何附加的配置。可以使用下列工具之一来在全局程序集缓存中安装一个程序集:
- 一个安装程序,如 Microsoft Windows Installer, version 2.0
- 全局程序集缓存工具命令行实用程序( Gacutil.exe )
- .NET Framework 配置工具 ( Mscorcfg.msc )
分发密钥图 1 示例了由应用程序块支持的管理和分发密钥的过程。在 Computer A 中,使用配置控制台来读取保存在一个文件中的已加密的密钥。配置控制台依赖于加密应用程序块来完成此事情。应用程序块使用 DPAPI 来在内存中解密密钥,然后使用配置控制台的加密密钥向导显示出来(如果没有使用向导来编辑密钥,它将在内存中保持加密)。当导出密钥到一个文件中时,应用程序块使用提供的密码和一个随机生成的熵值来加密密钥。传输包含密钥的文件到 Computer B 中,然后使用配置控制台来从文件中导入密钥。在保存应用程序配置时,配置控制台使用应用程序块来用 DPAPI 加密密钥,并将它保存到一个本地文件中。
 密钥分发 |
配置控制台在配置源中的 <securityCryptographyConfiguration> 节中保存每个密钥文件的绝对路径。例如,如果使用的是默认配置源,应用程序配置文件将包含密钥文件的绝对路径。如果要将应用程序部署到另一计算机上,必须部署密钥文件到同样的绝对路径中或者更新计算机上的配置源的 <securityCryptographyConfiguration> 节以反映新的位置。
顶部编辑更新加密应用程序块
如果加密应用程序块的一个更新版本可通知,可以安装更新的版本,然后所有应用程序都可以使用更新的程序集。然而,如果更新的版本引起某些应用程序的兼容问题,可以安装更新版本到全局程序集缓存中并配置某些应用程序使用更新后的版本,而其他的继续使用以前的版本。
更新私有程序集如果加密应用程序块的程序集被部署为私有程序集,就可以用更新的 DLL 简单的替换掉应用程序文件夹层次中的早期版本的 DLL 来部署升级。
注意:可以保留早期版本的一个副本,这样如果在使用新的程序集时出现任何兼容问题,都可以恢复到早期的版本。
更新共享程序集升级共享配置中的加密应用程序块最容易的方法是安装更新的 DLL 到全局程序集缓存中。默认的,通用语言运行时会尝试加载最后的构建和版本号,且与应用程序构建使用的程序集有着同样的主和次版本号的程序集。因此,如果主版本号和次版本号没有改变,添加更新版本到全局程序集缓存中并自动更新所有引用加密应用程序块程序集的应用程序。
顶部编辑度量加密应用程序块
这是在应用程序配置文件中的用于开启/关闭度量的节。它们是可选的,但是在文件中必须同时出现或者同时不出现。如果忽略它们,这将与所有值都是
false 一样。<configSections> 节是指定
System.Configuration 库如果读取真实配置数据的地方。真实数据在
<instrumentationConfiguration> 节中。设计一个值为
true 以打开度量,设置值为
false 将关闭度量。三种度量为性能计数器、事件日志和 WMI 事件。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="instrumentationConfiguration"
type="Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.Configuration.InstrumentationConfigurationSection,
Microsoft.Practices.EnterpriseLibrary.Common, Version=2.9.9.0, Culture=neutral, PublicKeyToken=null" />
</configSections>
<instrumentationConfiguration performanceCountersEnabled="true" eventLoggingEnabled="true" wmiEnabled="true" />
</configuration>
顶部编辑加密应用程序块性能计算器
表1 描述了加密应用程序块的性能计数器。
表1:加密应用程序块的性能计数器| 性能计数器 | 描述 |
|---|
| Hash Comparisons/sec | 哈希比较执行的速率。 |
| Hash Mismatches/sec | 检测到的未匹配的哈希比较的速率。 |
| Hash Operations/sec | 哈希纯文本的速率。 |
| Symmetric Decryptions/sec | 执行对称解密的速率。 |
| Symmetric Encryptions/sec | 执行对称加密的速率。 |
速率示例了随着时间的事件的增长数量,并按时间分割值的改变,以显示活动的速率。关于性能计数器的更多信息,请参见 MSDN 上的 .NET Framework 类库中的
PerformanceCounterType Enumeration 。
顶部编辑加密应用程序块事件日志实体
表1列出了加密应用程序块的事件日志实体。监听器列是触发事件的类,事件列是事件的名称,异常列是异常的布尔值,主消息列是主要的错误消息,其他列是可用的任何其他信息。
表1:加密应用程序块事件日志实体| 监听器 | 事件 | 异常 | 主消息 | 其他 |
|---|
| SymmetricAlgorithmInstrumentationListener | CryptographicOperationFailed | true | 使用实例实例名时发生错误。 | 解密操作失败。 |
| SymmetricAlgorithmInstrumentationListener | CryptographicOperationFailed | true | 使用实例实例名时发生错误。 | 加密操作失败。 |
| HashAlgorithmInstrumentationListener | CryptographicOperationFailed | true | 使用实例实例名时发生错误。 | 哈希比较失败。 |
| HashAlgorithmInstrumentationListener | CryptographicOperationFailed | true | 使用实例实例名时发生错误。 | 哈希创建失败。 |
| DefaultCryptographyEventLogger | ConfigurationFailure | true | 使用实例实例名时发生错误。 | 为哈希算法实例实例名获取配置时出错。 |
| DefaultCryptographyEventLogger | ConfigurationFailure | true | 使用实例实例名时发生错误。 | 为对称算法实例实例名获取配置时出错。 |
顶部编辑加密应用程序块 WMI 事件
加密应用程序块由下列 WMI 事件度量:
- HashOperationFailedEvent
- HashMisMatchDetectedEvent
- SymmetricOperationFailedEvent
- CryptograhyConfigurationFailureEvent
下列表格描述了每个 WMI 事件的属性。
表1描述了
HashOperationFailedEvent WMI 事件的属性
表1:HashOperationFailedEvent 的属性| WMI 属性 | 描述 |
|---|
| ExceptionMessage | 在哈希失败时触发的异常的消息 |
| ErrorMessage | 描述哈希操作时如何失败的消息。 |
| InstanceName | 遭受失败的哈希提供程序的 ID ,就是在配置文件中指定的。 |
| UtcTimeStamp | 哈希操作失败的时间 |
表 2 描述了
HashMisMatchDetectedEvent WMI 事件的属性
表 2:HashMisMatchDetectedEvent 的属性| WMI 属性 | 描述 |
|---|
| InstanceName | 检测到未匹配的哈希提供程序的 ID ,就是在配置文件中指定的名称。 |
| UtcTimeStamp | 未匹配检测到的时间。 |
表 3 描述了
SymmetricOperationFailedEvent WMI 事件的属性
SymmetricOperationFailedEvent 的属性| WMI 属性 | 描述 |
|---|
| ExceptionMessage | 当对称操作失败时触发的异常的消息。 |
| ErrorMessage | 描述对称操作是如何失败的消息。 |
| InstanceName | 遭受失败的对称提供程序的 ID ,即在配置文件中指定的名称。 |
| UtcTimeStamp | 对称操作失败的时间。 |
表 4 描述了
CryptographyConfigurationFailureEvent WMI 事件的属性
表 4 :CryptographyConfigurationFailureEvent 的属性| WMI 属性 | 描述 |
|---|
| ExceptionMessage | 当试图创建或配置加密提供程序失败时触发的异常的消息。 |
| InstanceName | 无法创建或配置的加密提供程序的 ID ,即在配置文件中指定的名称。 |
| UtcTimeStamp | 配置失败发生的时间。 |
顶部编辑快速入门
Enterprise Library 快速入门是简单的、易于理解的应用程序块关键特性的示例,使用了一个实现了常规场景的漫游集合来说明这些特性。
如果要理解一个应用程序块,快速入门将是理想的起始点,并且用试验源代码来学习新的技术也是非常舒服的。如果已对 .NET 框架比较熟悉,以及如果要查看简单的、有助于理解如何解决特定问题的代码示例的话,它们将是非常好的资源。
要使用快速入门的所有优点的话,将需要熟悉面向对象编程相关的概念和技术。
顶部编辑加密快速入门
加密应用程序块快速入门示范了如下场景:
- 加密秘密
- 解密秘密
- 从文本中获取一个哈希
- 检查哈希是否与某些文本匹配
系统需求要构建和运行快速入门,需要下列东东:
- Microsoft Windows 2000, Windows XP Professional, 或者 Windows Server 2003 操作系统
- Microsoft .NET Framework, version 2.0 或者 3.0
- Microsoft Visual Studio 2005 开发系统
快速入门在构建和运行应用程序之前不需要执行任何安装步骤。
构建快速入门快速入门是源代码形式的,这意味着在运行它之前必须编译它。可以使用 Visual Studio 来构建快速入门。
构建快速入门
- 确认已安装 Enterprise Library 内核
- 从 Winidows 资源管理器中打开 Enterprise Library 源代码,或者从开始菜单快捷方式中:在任务栏上,单击开始,指向程序,指向 Microsoft patterns and practices,指向 Enterprise Library 3.1 – May 2007 ,然后选择 Enterprise Library 3.1 Source Folder。
- 打开 QuickStarts 文件夹,然后是 Cryptography ,再然后是 CS(用于C#)或者 VB (用于 Visual Basic .NET)。
- 双击 CryptographyQuickStart.sln 图标。
- Visual Studio 打开并显示解决方案文件。在菜单中,单击 生成。
- 单击 重新生成解决方案。默认情况下,这是一个 debug 构建。
- 按下 F5 运行快速入门。
快速入门的配置在加密快速入门的漫游中带有一个默认的配置,它包含在 App.config 文件中。此文件和快速入门项目文件在同一目录中。
要修改或查看这些设置,使用 Enterprise Library 配置控制台打开在包含快速入门项目文件的目录中的 App.config 文件。App.config 文件包含了配置数据。
每次构建代码时,Visual Studio 都为项目复制 App.config 文件到输出目录(创建快速入门可执行文件的目录),并更名为 CryptographyQuickStart.exe.config 。
这意味着如果要使用配置控制台修改任何配置设置,如加密密钥,以及要重建解决方案,都必须打开放置在快速入门源代码目录中的 App.config 文件来修改配置。也可以使用 Enterprise Library 配置控制台打开 CryptographyQuickStart.exe.config 来修改应用程序的配置。然而,这些修改将在下一次成功构建时被覆盖。加密快速入门包含了下列的默认配置:
Name: hash provider
Type: SHA1Managed
SaltEnabled: True
Name: symprovider
Type: Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.SymmetricAlgorithmProvider
algorithmType: RijndaelManaged
protectedKeyFilename: <installdir>\QuickStarts\Cryptography\SymmetricKeyFile.txt
注意:快速入门的方法 CreateKeys 生成一个密钥并将它保存在此文件中。
protectedKeyProtectionScope: LocalMachine
顶部编辑漫游:加密秘密
此漫游示范了如何使用加密应用程序块加密一些文本。
重建示例1.声明适当的变量和常量。
C#
const string symmProvider = "symprovider";
string stringToEncrypt;
string encryptedContentsBase64;
Visual Basic
Const symmProvider As String = "symprovider"
Dim stringToEncrypt As String
Dim encryptedContentsBase64 As String
2.从用户处获取文本
C#
stringToEncrypt = "Sample text";
Visual Basic
stringToEncrypt = "Sample text"
3.调用 Cryptographer 类的静态方法 EncryptSymmetric 完成加密,方法支持配置的的对称提供程序名称的使用。
C#
encryptedContentsBase64 = Cryptographer.EncryptSymmetric(symmProvider, stringToEncrypt);
Visual Basic
encryptedContentsBase64 = Cryptographer.EncryptSymmetric(symmProvider, stringToEncrypt)
顶部
编辑漫游:解密秘密
此漫游示范了如何使用加密应用程序块解密文本。
重建示例1.声明适当的变量和常量。
C#
const string symmProvider = "symprovider";
string encryptedContentsBase64;
Visual Basic
Const symmProvider As String = "symprovider"
Dim encryptedContentsBase64 As String
2.调用 Cryptographer 类的静态方法 DecryptSymmetric 来完成解密,方法支持配置的对称提供程序名称的使用。下列代码假设成员变量 encryptedContents 包含使用同样的对称提供程序加密的字符串。
C#
string decryptedContents = Cryptographer.DecryptSymmetric(symmProvider, encryptedContentsBase64);
Visual Basic
Dim decryptedContents As String = Cryptographer.DecryptSymmetric(symmProvider, encryptedContentsBase64)
顶部
编辑漫游:从数据中获取哈希
此漫游示范了如何使用加密应用程序块从一些文本中获取哈希。
重建示例1.声明适当的变量和常量。
C#
private const string hashProvider = "hashprovider";
private string stringForHash;
private byte[] generatedHash;
Visual Basic
Const hashProvider As String = "hashprovider"
Dim stringForHash As String
Dim generatedHash As Byte()
2.从用户处获取数据。
C#
byte[] plainText = Encoding.UTF8.GetBytes("password");
Visual Basic
Dim valueToHash As Byte() = Encoding.UTF8.GetBytes("password")
3.调用 Cryptographer 类的静态方法 CreateHash 来获取哈希,方法支持配置的哈希提供程序名称的使用。
C#
generatedHash = Cryptographer.CreateHash(hashProvider, valueToHash);
Visual Basic
generatedHash = Cryptographer.CreateHash(hashProvider, valueToHash)
顶部
编辑漫游:验证哈希值是否匹配某些文本
此漫游示范了如何使用加密应用程序块验证以前生成的哈希是否匹配一些文本的哈希。
重建示例1.声明合适的变量和常量
C#
const string hashProvider = "hashprovider";
byte[] generatedHash;
Visual Basic
Const hashProvider As String = "hashprovider"
Dim generatedHash As Byte()
2.从用户处获得文本
C#
byte[] plainText = Encoding.UTF8.GetBytes("password");
Visual Basic
Dim valueToHash As Byte() = Encoding.UTF8.GetBytes("password")
3.调用 Cryptographer 类的静态方法 CompareHash 来获取哈希,支持配置的哈希提供程序的名称的使用。此代码假设成员变量 generatedHash 包含以前为一些文本生成的哈希。
C#
bool comparisonSucceeded = Cryptographer.CompareHash(hashProvider, valueToHash, generatedHash);
Visual Basic
Dim comparisonSucceeded As Boolean = Cryptographer.CompareHash(hashProvider, valueToHash, generatedHash)
顶部