Jar*_*obb 134
MD5哈希密码不可逆.(MD5是散列,并没有真正加密,所以有一个微妙的区别).而且是你一定要提供密码"复位"过程(而不是简单地通过电子邮件发送密码).
为您提供安全密码重置的高级工作流程......
为了给你更多细节哈希...
当您使用PHP中的md5()函数散列类似密码的值时,无论您在哪个服务器上运行该密码,最终值都将相同.(因此,我们可以立即看到哈希和加密之间的一个区别......没有涉及私钥/公钥).
因此,您可以看到人们提到彩虹表的漏洞.彩虹表的一个非常基本的解释是...你md5()散列一堆字典单词(弱密码),以获得他们的md5()哈希值.将它们放在数据库表(彩虹表)中.
现在,如果您破坏了网站的数据库,您可以针对您的彩虹表运行用户的散列密码(实质上)将散列"反向"回密码.(你并没有真正"扭转"哈希......但你得到了这个想法).
这就是"腌制"密码的最佳做法.这意味着(再次,这里是非常基本的想法),您在散列之前将随机值附加到用户的密码.现在,当彩虹表针对您的数据库运行时,它不像"反转"那么容易"因为"密码"的md5()散列与"password384746"不同.
这是一个很好的SO Q/A,应该有所帮助.为PHP密码保护哈希和盐
根据这篇文章关于基于表单的网站身份验证的权威指南,对于步骤3和4.,我不确定您是否应该发送您正在存储的相同令牌.
我猜你必须发送令牌,然后散列它并将散列的令牌存储在DB中.否则,如果您的数据库遭到入侵,则可以访问重置密码页面.
总结一下:
$token = md5(microtime (TRUE)*100000);
$tokenToSendInMail = $token;
$tokenToStoreInDB = hash($token);
Run Code Online (Sandbox Code Playgroud)
hash是一种散列算法.