【发布时间】:2016-03-15 15:15:45
【问题描述】:
我曾尝试使用 UTF8 算法和 SHA256 进行密码加密,但被建议不要使用它们。相反,我被建议使用 DPAPI。我从谷歌浏览了一些不清楚的示例代码。你能帮我处理一下 DPAPI 算法吗?
【问题讨论】:
标签: c# encryption dpapi
我曾尝试使用 UTF8 算法和 SHA256 进行密码加密,但被建议不要使用它们。相反,我被建议使用 DPAPI。我从谷歌浏览了一些不清楚的示例代码。你能帮我处理一下 DPAPI 算法吗?
【问题讨论】:
标签: c# encryption dpapi
您可以使用 ProtectedData 类访问 DPAPI。 有两种加密方式:
编码一个字符串并返回一个可以保存在数据库中的 Base64 字符串:
public static string Protect(string stringToEncrypt, string optionalEntropy, DataProtectionScope scope)
{
return Convert.ToBase64String(
ProtectedData.Protect(
Encoding.UTF8.GetBytes(stringToEncrypt)
, optionalEntropy != null ? Encoding.UTF8.GetBytes(optionalEntropy) : null
, scope));
}
解码一个 Base64 字符串(您之前保存在数据库中):
public static string Unprotect(string encryptedString, string optionalEntropy, DataProtectionScope scope)
{
return Encoding.UTF8.GetString(
ProtectedData.Unprotect(
Convert.FromBase64String(encryptedString)
, optionalEntropy != null ? Encoding.UTF8.GetBytes(optionalEntropy) : null
, scope));
}
您需要记住,加密仅对机器有效(和用户,如果您选择CurrentUser 加密模式),因此需要在同一台服务器上执行加密/解密。
如果您打算在负载平衡环境下使用 DPAPI see this article。
如果您需要更多信息,请告诉我。
【讨论】:
根据MSDN,DPAPI 是“使用用户或机器凭据来加密或解密数据”。我认为它使用 DES 或 AES 算法。
但是对于密码,在保存到数据库之前,您应该始终使用带盐的单向哈希函数(MD5、SHA1...)。即使黑客可以访问您的服务器,他也永远无法解密用户的密码。
所以,请坚持使用您的 SHA256 解决方案。记得在哈希之前加点盐。
【讨论】: