本文描述如何创建用于窗体身份验证 cookie 数据的加密、解密和验证的密钥。您可以将本文中创建的密钥用于 Machine.config 文件中的
<system.web>
元素中的 <machineKey> 节的
validationKey
和
decryptionKey
属性。
注意 :所创建的十六进制字符串的大小是从命令行传入值的大小的两倍。例如,如果您为密钥指定 24 字节,则转换后相应的字符串长度为 48 字节。 decryptionKey 的有效值为 8 或 24。此属性将为数据加密标准 (DES) 创建一个 16 字节密钥,或者为三重 DES 创建一个 48 字节密钥。 validationKey 的有效值为 20 到 64。此属性将创建长度从 40 到 128 字节的密钥。代码的输出是一个完整的 <machineKey> 元素,您可以将其复制并粘贴到 Machine.config 文件中。
将以下代码添加到 .cs 文件中:
从命令提示符下运行该应用程序,方法是通过传入两个整数值,它们的大小分别为加密密钥和验证密钥的大小。例如,如果您将控制台应用程序命名为 HashConfigCs.exe,则通过命令行在该应用程序的 Bin\debug 目录下键入以下语法:
注意
:由于代码正在使用随机数生成器,所以每次都会生成不同的输出。
要求
下面的列表概述了推荐使用的硬件、软件、网络基础结构以及所需的 Service Pack:- Microsoft Windows 2000 或 Microsoft Windows XP
- Microsoft .NET Framework
- Microsoft Internet 信息服务 (IIS)
创建项目
创建 Visual C# .NET 控制台应用程序:- 启动 Visual Studio .NET。
- 在文件菜单上,指向新建,然后单击项目。
- 在项目类型下,单击 Visual C# 项目。
- 在模板下,单击“控制台应用程序”。
- 将该项目命名为 HashConfigCs。
- 单击确定。
编写用于生成密钥的代码
下面的代码将读取从命令行传入的两个参数:- 第一个参数是用于创建 decryptionKey 属性的字节数。
- 第二个参数是用于创建 validationKey 属性的字节数。
注意 :所创建的十六进制字符串的大小是从命令行传入值的大小的两倍。例如,如果您为密钥指定 24 字节,则转换后相应的字符串长度为 48 字节。 decryptionKey 的有效值为 8 或 24。此属性将为数据加密标准 (DES) 创建一个 16 字节密钥,或者为三重 DES 创建一个 48 字节密钥。 validationKey 的有效值为 20 到 64。此属性将创建长度从 40 到 128 字节的密钥。代码的输出是一个完整的 <machineKey> 元素,您可以将其复制并粘贴到 Machine.config 文件中。
将以下代码添加到 .cs 文件中:
using System; using System.Text; using System.Security.Cryptography; namespace Crypto { public class KeyCreator { public static void Main(String[] args) { String[] commandLineArgs = System.Environment.GetCommandLineArgs(); string decryptionKey = CreateKey(System.Convert.ToInt32(commandLineArgs[1])); string validationKey = CreateKey(System.Convert.ToInt32(commandLineArgs[2])); Console.WriteLine("<machineKey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\"/>", validationKey, decryptionKey); } static String CreateKey(int numBytes) { RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] buff = new byte[numBytes]; rng.GetBytes(buff); return BytesToHexString(buff); } static String BytesToHexString(byte[] bytes) { StringBuilder hexString = new StringBuilder(64); for (int counter = 0; counter < bytes.Length; counter++) { hexString.Append(String.Format("{0:X2}", bytes[counter])); } return hexString.ToString(); } } }
生成哈希
现在可编译应用程序。从命令提示符下运行该应用程序,方法是通过传入两个整数值,它们的大小分别为加密密钥和验证密钥的大小。例如,如果您将控制台应用程序命名为 HashConfigCs.exe,则通过命令行在该应用程序的 Bin\debug 目录下键入以下语法:
hashconfigcs.exe 24 64
您可以预期该应用程序返回类似于以下内容的输出:
<machineKey validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B" decryptionKey="261F793EB53B761503AC445E0CA28DA44AA9B3CF06263B77" validation="SHA1"/>