如果密钥已知,如何解码md5


How to decode md5 if the key is known?

我使用以下方法生成哈希。$hash是ip和key的混合体。

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

我有哈希和密钥,我如何解码哈希来发现ip地址?

[密码]哈希函数是一个单向运算-也就是说,它不是双射函数,并且服从鸽子洞原理。

也就是说,给定受限域,可以通过为域中的每个值生成哈希并将其与预期哈希进行比较来发现冲突(如果存在)。这就是所谓的暴力攻击。

在这种情况下,输入域看起来被限制为"a.b.c"(IPv4地址的4个八位字节中的3个),其中a、b和c是在0..255范围内的值:因此有256^3~2^24~1600万个输入的上限来检查1

同样,这不是反转哈希,而是找到一些输入-可能不是原始值!-从而产生特定的散列值。


1现代CPU——更不用说GPU和专门的哈希硬件了——在1600万次哈希生成时都不会眨眼。这就是为什么密码哈希必须使用不同的salt(以避免彩虹表)慢哈希函数(如bcrypt或scrypt)的原因。

你没有键,你有一个salt,它只是连接到你最初散列的数据上的额外数据。

哈希是单向函数。它们无法解码。

你可以很容易地向自己证明这一点。想想一个大文件。。。GB大小。如果你把它传递到一个散列函数中,比如MD5,你仍然会得到32个字符的散列。现在,如果我们能用这种方法压缩数据并撤消它,世界上的存储问题就会得到解决!这是不可能的。

散列是单向的另一个原因是会发生冲突。对于任何给定的散列,有许多(无限?)方法可以用不同的数据获得相同的散列。

有几种不同类型的加密:

对称:如果你知道算法和密钥,你可以来回走动。即:Base64

非对称:公钥和私钥,私钥用于加密,公钥用于解密。因此,只有当你有合适的钥匙时,你才能来回走动。即:RSA

哈希:单向加密。一旦消息被散列,返回或恢复消息是极其困难的(取决于算法)。即:MD5、SHA1、SHA256

如果您想恢复原始消息,您可能需要更改加密内容的方式。