使用DPAPI保护加密密钥

时间:2011-02-11 09:57:26

标签: asp.net encryption dns dpapi

我正在编写一个asp.net应用程序来加密敏感数据,该数据由运行在同一域中不同用户帐户的另一个asp.net应用程序解密。

我已经阅读了很多文章,说使用DPAPI将密钥管理传递给操作系统级别。

如何在这种情况下使用DPAPI?我不想将加密密钥存储在文件或数据库中。

1 个答案:

答案 0 :(得分:0)

您需要引用System.Security,并且具有与此类似的代码(它是VB.NET,但它通常移植到C#):

Imports System.Security.Cryptography 

' ....

Dim sensitiveDataBytes() As Byte = Encoding.Unicode.GetBytes(sensitiveData)
Dim entropy As Byte() = Guid.NewGuid().ToByteArray()
Dim encryptedSensitiveDataBytes() As Byte = ProtectedData.Protect(sensitiveDataBytes, entropy, DataProtectionScope.LocalMachine)
Dim entropyPlusSensitiveData As Byte() = entropy.Concat(encryptedSensitiveDataBytes).ToArray()

Return entropyPlusSensitiveData

您在这里做的是使用System.Security.Cryptography.ProtectedData来使用DPAPI来保护具有“本地计算机”范围的数据,然后创建一些随机的16字节熵,您可以将其添加到加密数据。然后你可以安全地传递16+(加密数据长度)大小的数组。

在解密方面你做了一个类似的技巧:你剥离了16个熵字节,然后用DPAPI解密:

Dim entropyPlusSensitiveData As Byte() = data ' the byte array created previously
Dim entropy() As Byte = entropyPlusSensitiveData.Take(16).ToArray()
Dim encryptedSensitiveDataBytes() As Byte = entropyPlusSensitiveData.Skip(16).ToArray()
Dim sensitiveDataBytes() As Byte = ProtectedData.Unprotect(encryptedSensitiveDataBytes, entropy, DataProtectionScope.LocalMachine)

熵不是严格要求的,但强烈建议使用。