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

问题描述:

我试过使用UTF8算法和SHA256进行密码加密,但被建议不要使用它们。相反,我被建议使用DPAPI。我浏览了几个谷歌示例代码,但不清楚。你能帮我用DPAPI算法吗?在C#中进行DPAPI密码加密并保存到数据库中。然后使用密钥对其进行解密

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

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

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

+0

您不想使用MD5或SHA-1,因为它们速度太快,并且可能会在现代硬件上轻松强制实施。你会想要像bcrypt或另一个硬密码功能。另外,这个问题并不意味着用户可以控制密码验证,只是希望存储密码。 – Dan

您可以使用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加密模式)有效,所以需要在同一台服务器上执行加密/解密。

如果您打算在负载平衡环境see this article下使用DPAPI。

让我知道你是否需要更多信息。