我有一個需要驗證活動目錄帳戶的MVC應用程序。我想將帳戶名稱和密碼存儲在web.config文件中。在web.config文件中以不可逆加密格式存儲密碼
我在尋找的是在web.config文件中以不可逆加密格式存儲此帳戶密碼的最佳防彈方法的建議。
但是,接受這一要求的另一種方式也是受歡迎的,因爲我第一次做這種事情,所以我不確定其他人如何安全地在web.config文件中存儲密碼然後從應用程序中讀取它。
我有一個需要驗證活動目錄帳戶的MVC應用程序。我想將帳戶名稱和密碼存儲在web.config文件中。在web.config文件中以不可逆加密格式存儲密碼
我在尋找的是在web.config文件中以不可逆加密格式存儲此帳戶密碼的最佳防彈方法的建議。
但是,接受這一要求的另一種方式也是受歡迎的,因爲我第一次做這種事情,所以我不確定其他人如何安全地在web.config文件中存儲密碼然後從應用程序中讀取它。
你可以做到以下幾點:
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();
}
}
}
我實際上可能會推薦使用您鏈接的CodeProject文章中的代碼而不是您共享的代碼。無論如何,似乎更適合我的目的。 – Kehlan
很高興知道,如果答案有幫助請標記爲已選中。謝謝。 –
加密並非不可逆轉。密碼也需要散列(最好是鹽漬)。然後,使用相同的散列算法對用戶的輸入進行散列並比較結果。 –
感謝提及散列而不是加密。在我的場景中,不會有用戶輸入,它只是針對AD對一個知道的帳戶進行身份驗證,但管理員無法以純文本形式提供密碼以存儲在web.config中。你是否認爲管理員可以對密碼進行哈希和加密,然後將哈希和鹽漬密碼作爲密碼存儲在配置文件中。 – StackTrace
不知道我理解這種情況,或者你爲什麼需要這樣做,但我沒有理由不這樣做。 [本文](https://crackstation.net/hashing-security.htm)值得一讀。 –