现在,如果您想解码散列,首先需要弄清楚如何将给定的散列分割为其迭代状态(1种可能用于小于数据块大小的输入,许多用于较大的输入)。然后需要为每个状态反转迭代。现在,为了解释为什么这非常困难,想象一下试图从下面的公式中推导出a和b: 10 = a + b。a和b有10个积极的组合可以工作。现在循环几次:tmp = a + b; a = b; b = tmp。对于64次迭代,你将有超过10^64种可能性去尝试。这只是一个简单的加法在一次又一次的迭代中保留了一些状态。真正的哈希函数做的操作远不止1个(MD5对4个状态变量做大约15个操作)。由于下一次迭代依赖于前一次的状态,而前一次在创建当前状态时被破坏,因此几乎不可能确定导致给定输出状态的输入状态(对于每次迭代都是如此)。结合这一点,以及涉及的大量可能性,即使是解码MD5也将占用几乎无限(但不是无限)的资源。如此多的资源,以至于如果您知道输入的大小(对于更小的输入),那么强制使用哈希实际上比尝试解码哈希要便宜得多。
// Invoke this little script 3 times, and it will give you everytime a new hash
$password = '1234';
$hash = password_hash($password, PASSWORD_DEFAULT);
echo $hash;
// OUTPUT
$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu
$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u
$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW
一个密码可以由多个哈希表示。
当您使用password_verify()验证具有不同密码散列的密码时,该密码将被接受为有效密码。< / p >
$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);
//OUTPUT:
string 'My age is 29' (length=12)