在C#中对DPAPI密码进行加密并保存到数据库中.然后使用密钥对其进行解密

本文关键字:然后 解密 密钥对 数据库 保存 DPAPI 中对 密码 加密 | 更新日期: 2023-09-27 18:26:23

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

在C#中对DPAPI密码进行加密并保存到数据库中.然后使用密钥对其进行解密

您可以使用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,请参阅本文。

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

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

但对于密码,在保存到DB之前,您应该始终使用带salt的单向散列函数(MD5、SHA1…)。即使黑客可以访问你的服务器,他也永远无法解密用户的密码。

所以,只需坚持使用您的SHA256解决方案。记得在捣碎之前加一些盐。