1

我有一個需要驗證活動目錄帳戶的MVC應用程序。我想將帳戶名稱和密碼存儲在web.config文件中。在web.config文件中以不可逆加密格式存儲密碼

我在尋找的是在web.config文件中以不可逆加密格式存儲此帳戶密碼的最佳防彈方法的建議。

但是,接受這一要求的另一種方式也是受歡迎的,因爲我第一次做這種事情,所以我不確定其他人如何安全地在web.config文件中存儲密碼然後從應用程序中讀取它。

+1

加密並非不可逆轉。密碼也需要散列(最好是鹽漬)。然後,使用相同的散列算法對用戶的輸入進行散列並比較結果。 –

+0

感謝提及散列而不是加密。在我的場景中,不會有用戶輸入,它只是針對AD對一個知道的帳戶進行身份驗證,但管理員無法以純文本形式提供密碼以存儲在web.config中。你是否認爲管理員可以對密碼進行哈希和加密,然後將哈希和鹽漬密碼作爲密碼存儲在配置文件中。 – StackTrace

+1

不知道我理解這種情況,或者你爲什麼需要這樣做,但我沒有理由不這樣做。 [本文](https://crackstation.net/hashing-security.htm)值得一讀。 –

回答

2

你可以做到以下幾點:

https://msdn.microsoft.com/en-us/library/zhhddkxy%28v=vs.140%29.aspx https://msdn.microsoft.com/en-us/library/dtkwfdky(v=vs.140).aspx

即加密/譴責不過,我認爲你所要求的是一種單向散列。如果你想散列這很容易,但這需要你將散列存儲在web.config中。然後,當登錄嘗試發生時,然後使用您的預定義算法對提交的密碼進行哈希並比較匹配。

怎麼做散列: http://www.codeproject.com/Articles/704865/Salted-Password-Hashing-Doing-it-Right

代碼使用已知的鹽在C#中的散列。這是很久以前從其他地方解除的。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Security.Cryptography; 

namespace Helpers 
{ 
public class SaltedHashPassword 
{ 
    /// <summary> 
    /// Hashed password to save. 
    /// </summary> 
    public string Hash { get; private set; } 

    /// <summary> 
    /// Salt used to generate the hased password. Save with the password as well. 
    /// </summary> 
    public string Salt { get; private set; } 

    public SaltedHashPassword(string password) 
    { 
     var saltBytes = new byte[32]; 
     using (var provider = RandomNumberGenerator.Create()) 
     { 
      provider.GetNonZeroBytes(saltBytes); 
     } 
     Salt = Convert.ToBase64String(saltBytes); 
     var passwordAndSaltBytes = Concat(password, saltBytes); 
     Hash = ComputeHash(passwordAndSaltBytes); 
    } 

    public static bool Verify(string salt, string hash, string password) 
    { 
     var saltBytes = Convert.FromBase64String(salt); 
     var passwordAndSaltBytes = Concat(password, saltBytes); 
     var hashAttempt = ComputeHash(passwordAndSaltBytes); 
     return hash == hashAttempt; 
    } 

    static private string ComputeHash(byte[] bytes) 
    { 
     using (var sha512 = SHA512.Create()) 
     { 
      return Convert.ToBase64String(sha512.ComputeHash(bytes)); 
     } 
    } 

    static private byte[] Concat(string password, byte[] saltBytes) 
    { 
     var passwordBytes = Encoding.UTF8.GetBytes(password); 
     return passwordBytes.Concat(saltBytes).ToArray(); 
    } 
} 

}

+0

我實際上可能會推薦使用您鏈接的CodeProject文章中的代碼而不是您共享的代碼。無論如何,似乎更適合我的目的。 – Kehlan

+0

很高興知道,如果答案有幫助請標記爲已選中。謝謝。 –