在理解了上一篇文章的基础上,本文将创建两个工具类,一个使用对称的加密算法,一个使用非对称的加密算法。
1. 管理秘密信息
必须采取某种措施来保护密钥,你当然可以对密钥本身进行加密,但这样就需要另一个加密密钥了,也会面临一样的问题。
Windows 提供了一个内置机制来保存和保护秘密数据。这个机制使用一个系统安装时创建的机器密钥来加密数据。只有本地的操作系统才可以访问这个机器密钥。当然,每一次安装时,这个机器密钥都是不同的。
Windows 支持 DPAPI 使用这个密钥来保护数据。当使用这个 API 的时候,你不能直接访问密钥,你只需要告诉系统使用机器密钥加密或者解密就可以了。因此,这解决了密钥管理的问题。
为此,.NET Framework 提供了 System.Security.Cryptography.ProtectedData 类,可以这样使用:
byte[] protData = ProtectedData.Protect(ClearBytes, null, DataProtectionScope.LocalMachine);
使用 DPAPI 非常容易,但不要用来加密数据库中的信息。如上述代码段中那样,使用了 DataProtectionScope.LocalMachine 设置,已加密的数据就是和这个机器绑定的。因此,如果这台机器崩溃了,而你必须在另一台机器上恢复数据,那你会丢失所有加密过的信息。如果你使用 DPAPI 加密密钥,你还应当在另一个安全的地方备份这个密钥。
2. 使用对称算法
对称加密算法使用同一个密钥来加密和解密数据。本例中,我们创建一个工具类,该类负责加密和解密敏感数据。然后,就可以在几个 Web 程序中重用这个类。这个工具类将具有如下所示的结构并且可以用于加密和解密字符串数据。
{
public static bool ProtectKey { get; set; }
public static string AlgorithmName { get; set; }
public static void GenerateKey(string targetFile) { }
public static void ReadKey(SymmetricAlgorithm algorithm, string file) { }
public static byte[] EncryptData(string data, string keyFile) { }
public static string DecryptData(byte[] data, string keyFile) { }
}