2013-11-22 34 views
-1

我正在使用以下方法來生成散列。 $hash是ip和key的混合體。如果密鑰已知,如何解碼md5?

$key = "my_key"; 
$pieces = explode(".", $remoteAddr); 
$ip = $pieces[0].".".$pieces[1].".".$pieces[2]; 
$hash = md5($ip.$key); 

我有散列和密鑰,我如何解碼哈希來發現IP地址?

+0

http://stackoverflow.com/questions/1240852/is-it-possible-to-decrypt-md5-hashes – Neysor

+4

哈希是單向的。他們不能被「解碼」。 – Jon

+0

哈希是單向的街道。你不能。 – Dave

回答

3

一個[cryptographic] hash function is a one-way operation - 也就是說,它是不是一個bijective function,是受Pigeonhole principle

也就是說,給定受限域,可以通過爲域中的每個值生成一個散列並將其與期望的散列進行比較來發現衝突(應該存在一個衝突)。這被稱爲brute-force攻擊。

在這種情況下,輸入域看起來被限制爲「abc」(IPv4地址的4個八位字節中的3個),其中a,b和c是0到255範圍內的值:因此存在256^3〜2^24〜1600萬輸入的上限來檢查。

再次,這是不倒車哈希,而是找到一些輸入 - 這可能不是原來的值! - 這會導致一個特定的散列值。


現代的CPU - 更不用說GPU和專用硬件哈希 - 不,即使在1600萬哈希代閃爍。這就是爲什麼密碼哈希必須使用一個明顯的鹽(避免彩虹表)緩慢的哈希函數,如bcrypt或scrypt。

2

你沒有密鑰,你有一個鹽,它只是額外的數據連接到你在第一個地方散列的東西。

哈希值是單向函數。它們不能被解碼。

你可以很容易地證明這一點。想象一個大文件......大小爲千兆字節。如果你想把它傳遞給一個散列函數,比如MD5,你仍然會得到32個字符的散列。現在,如果我們可以用這種方法壓縮數據並將其撤消,那麼世界的存儲問題就會得到解決!這是不可能的。

另一個原因哈希是單向的,是碰撞發生。對於任何給定的散列,有許多(無限?)方法來獲得與不同數據相同的散列。

3

有幾種不同類型的加密:

Symmetrical:你可以來回走,如果你知道算法和密鑰。即:Base64

Asymmetric:公鑰和私鑰,private用於加密並公開解密。因此,如果您擁有合適的鑰匙,您只能來回走動。即:RSA

Hashing:單向加密。一旦哈希被刪除,返回或恢復消息是非常困難的(取決於算法)。即:MD5,SHA1,SHA256

如果你想恢復原始信息,你可能想要改變你的加密方式。