在正式專案中密碼少不了需要加鹽處理,其中最常見的就是HASH。HASH算法是單向的,而且無法被反向計算。源頭數據改動一點點,HASH的結果也會完全不同。這樣特性很適合保存、驗證密碼。
但只有單純hash加上密碼簡單
的話,怪客可以用暴力比對方式,得出你的密碼,所以在Miniblog使用廣受認證的PBKDF2方式加密。
Code:
private bool VerifyHashedPassword(string password, IConfiguration config)
{
byte[] saltBytes = Encoding.UTF8.GetBytes(config["user:salt"]);
byte[] hashBytes = KeyDerivation.Pbkdf2(
password: password,
salt: saltBytes,
prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 1000,
numBytesRequested: 256 / 8
);
string hashText = BitConverter.ToString(hashBytes).Replace("-", string.Empty);
return hashText == config["user:password"];
}
使用方式很簡單,安裝NuGet KeyDerivation
就好:
Install-Package Microsoft.AspNetCore.Cryptography.KeyDerivation -Version 版本
KeyDerivation.Pbkdf2
方法,使用五個參數 :
1.password 顧名思義就是密碼,不多解釋。
2.salt,這邊可以使用一個密鑰key只有你知道,藉由Encoding.UTF8.GetBytes轉成byt陣列資料,傳進Pbkdf2參數,當鹽使用。
3.prf,PRF是一個偽隨機函數
4.iterationCount,hash次數,次數的不同,得出結果也會不同,通常越多次代表怪客破解難度變高,但效能會差點
5.numBytesRequested,指定得出結果長度
public static byte[] Pbkdf2(string password, byte[] salt, KeyDerivationPrf prf, int iterationCount, int numBytesRequested);