沒有。 SHA-1和其他哈希函數的目標是僅僅是單向的。如果甚至可以稍微加快將散列解碼爲原始值的過程,則散列函數機制將被認爲是破碎的並且許多人可能會退出使用該算法。
被使用的哈希函數的原因就是因爲你可以用它們來檢查您是否編碼相同的值(如果你編碼$value1
並得到了一些散列結果,然後編碼$value2
,得到了相同哈希結果,你可以肯定 - 幾乎 100%肯定 - 即$value1
等於$value2
)。 他們只是設計,使其非常困難(幾乎不可能)哈希解碼成輸入變量。
但是......
有嘗試和可能性去了解輸入變量,但它們都是基於Rainbow Tables概念。 彩虹表是由輸入變量對與生成的散列組成的表。它們是預編譯的並且大小很大,但它們允許您爲某些哈希值查找輸入值。
和這就是爲什麼鹽被引入。鹽被用來使輸入變量進一步複雜化,使彩虹表成爲不太可靠的解決方案。例如,如果您爲字符串'home'
生成了MD5
的散列,那麼您將得到106a6c241b8797f52e1e77317b96a201
散列,並且您可能可以使用Internet上的某些公共彩虹表服務對其進行解碼。但是如果你添加一些鹽(例如一些換行符號,一些非打印字符等),你會發現任何允許你解碼散列的彩虹表的機會(甚至是這樣一個短而簡單的單詞的散列)會極低。
還有一個額外的理由使用的鹽。原因如下。如果你使用鹽,例如。對於你的認證機制,所有的值都附加了這個salt。對於攻擊者來說,這意味着他必須確定創建一些給定散列值的值,並且此值必須包含您在系統中使用的鹽(散列函數本身能夠從兩個不同值創建一些散列值),然後提取原始輸入值(您附加到鹽值然後散列的值)以使其可用。所以這個問題進一步複雜化。
我希望這可以澄清哈希算法和鹽的概念。
不要試圖建立自己的密碼系統;使用已經證明。 – Gumbo 2011-05-25 18:03:24
一個美妙的比喻:SHA1是一臺絞肉機。你可以把一頭牛變成漢堡包,但不可能把漢堡包變回牛。 – 2011-05-25 18:15:33
@Marc但是,如果你有足夠大的漢堡牛的基數,你可以確定哪頭牛用來生產給定的漢堡包;)(見:[彩虹表](http://en.wikipedia.org/wiki/) Rainbow_table)) – Tadeck 2011-05-25 18:30:48