簡體   English   中英

使用 GetHashCode 來“保護”用戶密碼

[英]Using GetHashCode to “secure” users passwords

我工作的公司簽訂了一份大型訂單處理系統的支持合同。 作為初始系統審核的一部分,我注意到存儲在數據庫中的密碼實際上是密碼的哈希碼。

本質上:

string pwd = "some pasword";
string securePwd = pwd.GetHashCode();

我的問題是,這有多安全?

我對此感到不舒服,但我對 GetHashCode 的工作原理知之甚少。 我更喜歡使用像 MD5 hash 這樣的東西,但如果我在浪費時間,我就不會打擾。

您應該使用加鹽的、加密性強的 hash,例如SHA256Managed

Jeff Attwood 有一些關於這個主題的好帖子:

彩虹Hash破解

您可能錯誤地存儲了密碼

它不僅不安全,而且可能會發生變化:

http://netrsc.blogspot.com/2008/08/gethashcode-differs-on-systems.html

GetHashValue 為給定輸入返回的值在過去發生了變化。

無法保證在應用程序的不同執行之間它甚至是相同的。

GetHashCode返回一個 32 位 integer 作為 hash 值。 考慮到生日悖論,由於碰撞概率相對較高,它的 hash 值不夠長,即使它被明確設計為抗碰撞,但事實並非如此。

您應該 go 用於 SHA256 或其他加密安全 hash function 旨在處理此類任務。

要存儲密碼,僅使用簡單的 hash function 是不夠的。 您應該為每個用戶添加一些隨機的“鹽”並迭代足夠多的時間,這樣蠻力的計算成本就會很高。 因此,您應該使用具有大量迭代的 bcrypt、 scrypt 、PBKDF2 之類的東西。

我建議改用BCrypt 正如其他人已經說過的那樣,使用 GetHashCode 作為密碼並不是一個好主意。

GetHashCode 絕對不是為了以這種方式使用而設計的,因為實現不保證不同對象的不同 hash 返回。 這意味着多個密碼可能會產生相同的 hash。 也不能保證在不同版本的 .NET 框架上返回相同的 hash 值,這意味着升級可能會產生不同的 hash 對於相同的字符串,使您的密碼無法使用。

建議您一推就使用鹽漬 hash 甚至 MD5。 您可以輕松地將其切換到Security.Cryptography命名空間中的內容。

正如其他人所說,GetHashCode 不是為您想要做的事情而設計的。 一篇關於如何安全處理用戶密碼的非常好的文章

總結這篇文章,您需要使用相對較慢的自適應散列方案,例如bcrypt ,或者斯坦福安全遠程密碼協議 我建議前者。 當然,您還應該使用鹽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM