我正在使用以下方法生成哈希。 $hash
是ip和key的混合物。
$key = "my_key";
$pieces = explode(".", $remoteAddr);
$ip = $pieces[0].".".$pieces[1].".".$pieces[2];
$hash = md5($ip.$key);
我有哈希和密钥,如何解码哈希以发现IP地址?
答案 0 :(得分:3)
有几种不同类型的加密:
Symmetrical:如果你知道算法和密钥,你可以来回走动。即:Base64
Asymmetric:公钥和私钥,private用于加密和公共解密。因此,如果您有正确的钥匙,您只能来回走动。即:RSA
Hashing:单向加密。一旦消息被散列,返回或恢复消息是非常困难的(取决于算法)。即:MD5,SHA1,SHA256
如果要恢复原始邮件,可能需要更改加密内容的方式。
答案 1 :(得分:3)
[cryptographic] hash function is a one-way operation - 也就是说,它 <{3}}并且受bijective function的约束。
话虽如此,给定受限域,可以通过为域中的每个值生成哈希并将其与预期哈希进行比较来发现冲突(应该存在)。这被称为Pigeonhole principle攻击。
在这种情况下,输入域看起来被限制为“abc”(IPv4地址的4个八位字节中的3个),其中a,b和c是0..255范围内的值:因此存在上限为256 ^ 3~2 ^ 24~1600万输入,检查 1 。
同样,这是没有反转哈希,而是找到一些输入 - 这可能不是原始值! - 这会产生特定的哈希值。
1 现代CPU - 更不用说GPU和专用散列硬件 - 甚至不会在1600万个散列代中闪烁。这就是密码哈希必须使用不同的盐(以避免彩虹表)和慢速哈希函数(如bcrypt或scrypt)的原因。
答案 2 :(得分:2)
你没有钥匙,你有一个盐,这只是额外的数据连接到你最初的哈希值。
哈希是单向函数。它们无法解码。
您可以轻松地向自己证明这一点。想想一个大文件......千兆字节大小。如果你将它传递给哈希函数,比如MD5,你仍然会得到32个字符的哈希值。现在,如果我们可以压缩此方法中的数据并将其撤消,那么世界的存储问题就会得到解决!这是不可能的。
哈希的另一个原因是单向发生碰撞。对于任何给定的哈希,有许多(无限的?)方法来获得具有不同数据的相同哈希。