2013-11-22 37 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

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