我是C#的新手,這是我的第一個問題,所以我提前爲任何失禮道歉。驗證鹽漬散列
上下文:
當用戶寄存器我所說的CreateSaltedHash()方法和從文本字段傳遞給它用戶輸入的密碼。此方法在將密碼存儲在我的用戶表的密碼列中之前將其密碼存儲並散列化。
問:
我應該如何驗證密碼,當用戶試圖登錄?
如果我再次調用CreateSaltedHash()方法,它將因爲隨機鹽而不匹配。
我應該將鹽儲存在一個單獨的列中嗎?生成鹽漬散列時,我應該使用分隔符嗎?根據鹽漬和散列密碼驗證輸入密碼的最安全方法是什麼?
代碼: 這是我到目前爲止所。
public class PasswordHash
{
public const int SALT_BYTES = 32;
/*
* Method to create a salted hash
*/
public static byte[] CreateSaltedHash(string password)
{
RNGCryptoServiceProvider randromNumberGenerator = new RNGCryptoServiceProvider();
byte[] salt = new byte[SALT_BYTES];
randromNumberGenerator.GetBytes(salt);
HashAlgorithm hashAlgorithm = new SHA256Managed();
byte[] passwordByteArray = Encoding.UTF8.GetBytes(password);
byte[] passwordAndSalt = new byte[passwordByteArray.Length + SALT_BYTES];
for (int i = 0; i < passwordByteArray.Length; i++)
{
passwordAndSalt[i] = passwordByteArray[i];
}
for (int i = 0; i < salt.Length; i++)
{
passwordAndSalt[passwordByteArray.Length + i] = salt[i];
}
return hashAlgorithm.ComputeHash(passwordAndSalt);
}
public static bool OkPassword(string password)
{
//This is where I want to validate the password before logging in.
}
}
調用在註冊類中的方法。
User user= new User();
user.password = PasswordHash.CreateSaltedHash(TextBoxUserPassword.Text);
'我應該將鹽儲存在單獨的列中嗎 - 是的。然後引用那個。 – TheGeekZn
你理解你的hasing方法有一個嚴重的問題嗎?你真的應該使用hasing算法設計來保護密碼,你現在的選擇不是一個好的選擇。 –
我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –