2015-12-10 57 views

回答

0

根據MSDN,DPAPI「使用用戶或機器憑據來加密或解密數據」。我認爲它使用DES或AES算法。

但是對於密碼,在保存到數據庫之前,您應該始終使用帶鹽的單向散列函數(MD5,SHA1 ...)。即使黑客可以訪問你的服務器,他也永遠不能解密用戶的密碼。

所以,只需堅持使用您的SHA256解決方案。記得在散列之前添加一些鹽。

+0

您不想使用MD5或SHA-1,因爲它們速度太快,並且可能會在現代硬件上輕鬆強制實施。你會想要像bcrypt或另一個硬密碼功能。另外,這個問題並不意味着用戶可以控制密碼驗證,只是希望存儲密碼。 – Dan

4

您可以使用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。

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

相關問題