6

我曾尝试使用 UTF8 算法和 SHA256 进行密码加密,但有人建议不要使用它们。相反,我被建议使用 DPAPI。我从谷歌浏览了一些不清楚的示例代码。你能帮我处理一下 DPAPI 算法吗?

4

2 回答 2

20

您可以使用ProtectedData类访问 DPAPI 。有两种加密模式:

  • CurrentUser:受保护的数据与当前用户相关联。只有在当前用户上下文下运行的线程才能解除对数据的保护。
  • LocalMachine:受保护的数据与机器上下文相关联。计算机上运行的任何进程都可以取消保护数据。此枚举值通常用于特定于服务器的应用程序,这些应用程序在不允许不受信任的用户访问的服务器上运行。

编码一个字符串并返回一个可以保存在数据库中的 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,请参阅这篇文章

如果您需要更多信息,请告诉我。

于 2015-12-10T08:19:25.877 回答
0

根据MSDN,DPAPI 是“使用用户或机器凭据来加密或解密数据”。我认为它使用 DES 或 AES 算法。

但是对于密码,在保存到数据库之前,您应该始终使用带盐的单向哈希函数(MD5、SHA1...)。即使黑客可以访问您的服务器,他也永远无法解密用户的密码。

所以,只要坚持你的 SHA256 解决方案。记得在哈希之前加一些盐。

于 2015-12-10T07:57:40.040 回答