2

字符串對於我的項目,我得到了我的密碼字段值的的hashCode並存儲在數據庫中的哈希碼安全目的。現在我想恢復從hashCode.How我可以做密碼它? 是否有可能從hashCode返回字符串值。如果現在任何人都可以建議我更好的方式來存儲我的密碼在任何其他格式。我怎麼能得到的hashCode

+2

如果你可以從哈希中恢復你的密碼,哈希將如何提高你的安全性? – khelwood

+2

你不能。根據定義,哈希碼不可逆。請參閱[標籤:密碼加密](您自己的標籤)下的討論。 – EJP

+1

[哈希在Java中 - >從哈希和鹽](https://stackoverflow.com/q/38832367/608639)獲取密碼,[我如何檢索哈希密碼的原始明文密碼](https:// stackoverflow (https://stackoverflow.com/q/12026149/608639),[使用Java加密和解密密碼]。[/ q/23761505/608639] (https://stackoverflow.com/q/6592010/608639),[密碼存儲爲散列值時檢索密碼](https://stackoverflow.com/q/1013581/608639)等 – jww

回答

-1

不是一個好主意,應該的hashCode永遠不會被用作識別對象的證明平等......

考慮這個問題:

System.out.println("Aa".hashCode()); 
System.out.println("BB".hashCode()); 

都具有相同的hashCode 2112,但持有完全不同信息

+0

使用哈希碼作爲存儲的密碼完全依賴於這種技術。更重要的標準是密碼不應該可恢復,並且哈希代碼不應該是可逆的。 – EJP

+0

所以如果你的密碼是Aa,你還會得到BB嗎? –

+0

當然,這就是哈希碼的工作原理:它們是一個從大值空間到小值空間的映射,因此不可逆,正如我剛纔所說,這是真正的一點。密碼的不可逆性是解決[公司破壞問題](https://stackoverflow.com/questions/2283937/how-should-i-ethically-approach-user-password-storage-for-later-plaintext -retrie/2287672#2287672)。你的例子不太現實,但是根據定義,這個星球上的每個安全系統都使用密碼散列而不是密碼加密。 – EJP

2

散列是一個單向函數(它應該至少),所以你不能從哈希中恢復密碼。

但是,您可以將相同的散列應用於任何字符串,並將其與密碼的散列進行比較,以便檢查它們是否匹配。

具有良好的哈希,使用相同哈希的兩個字符串的機會相當低,因此您可以比較密碼(您可以存儲的)的哈希和另一個字符串的哈希以確定它們是否相同。

另一點是hashCode不是產生這種散列的好方法,因爲我們可以很容易地使用兩個具有相同散列碼的對象。您可以使用實現,如PBKDF2BCrypt

2

你知道幾個對象可以有相同的散列(),因爲它在Java文檔中提到了Object.hashCode()

這是要求,如果兩個對象不相等 *根據{@link java.lang.Object#equals(java.lang.Object)} *方法,然後調用每個 *上的{hashCode}方法*兩個對象必須產生不同的整數結果。

很明顯,你不能從同一個哈希碼中恢復不同的對象,所以根本不可能,簡單的邏輯。

1

一種技術是強制它。只需運行所有可能的密碼。如果散列算法的設計不是計算成本昂貴的,你可以通過一個令人驚訝的數字。

如果確實是String.hashCode那麼這不是密碼安全的。不是由一個長鏡頭。正如ΦXocę웃Pepeúpaツ的答案一樣,您可能手工倒退到一個(許多)可能的密碼。

你應該怎麼做?使用衆所周知的加密哈希。優選地,可以使計算成本高昂的一個例如bcrypt。此外,您應該使用密碼(在散列之前將密碼與密碼結合使用以防止使用緊湊的預先計算的查找表(彩虹表)來破解散列)。基本上使用別人的圖書館/系統。