[英]Encryption Salt Algo CryptSharp gives different encryption of password … How to get ride of this
在注冊時
string crypt = CryptSharp.Crypter.Sha512.GenerateSalt();
crypt = txtspss.Text.Trim();
crypt = CryptSharp.Crypter.Sha512.Crypt(txtspss.Text, crypt);
在登錄時..
string cpass=dr["strUPass"].ToString();
bool matches = Crypter.CheckPassword(pass,cpass);
if (matches)
{....}
鹽應該是獨一無二的。 通過這樣做,試圖破解密碼的人必須對每個密碼進行單獨的編譯,而不是能夠為一百萬個密碼生成哈希值,然后針對整個被盜密碼數據庫進行檢查。
CryptSharp以模塊化加密格式對密碼進行編碼。 這是設計。 假設算法是A,鹽是B,哈希是C.GenerateSalt寫AB,Crypt讀AB並生成C,返回ABC。 在下面,你看,CheckPassword或多或少等同於:
Crypter.Crypt(密碼,crypt)== crypt
因為Crypt只讀取AB,如果你傳遞ABC,它就像傳遞AB一樣。 這就是Crypt在生成和檢查密碼哈希值時的雙重任務。
在注冊時,GenerateSalt和Crypt,以及登錄時,CheckPassword。 許多人會告訴你關於分別存儲鹽等的這個或那個,這是一個很好的一般建議,但模塊化密碼格式的設計使得所需的一切都存儲在同一個字符串中。 這一切都得到了照顧。
哦...而且,在你的代碼中,你有一個bug。 你在中間的線路對你沒有任何幫助。 以下將正常工作:
string crypt = CryptSharp.Crypter.Sha512.GenerateSalt();
crypt = CryptSharp.Crypter.Sha512.Crypt(txtspss.Text.Trim(), crypt);
沒有足夠的代碼來說明究竟是什么問題,但你應該從使用結果開始
CryptSharp.Crypter.Sha512.GenerateSalt()
因為現在,您只需通過覆蓋以下行中的變量來轉儲它。
SHA512是一種哈希算法,為了使其更安全,可以抵御像彩虹表這樣的攻擊,庫方法可以選擇使用鹽值。
當散列和比較新值的散列時,應該存在相同的salt值,並且在您的代碼中,您似乎沒有這樣做。
注冊用戶時; Salt應存儲在數據庫中並在登錄時檢索,以便將其提供給CheckPassword函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.