我想做的是有这样的事情
$res_5a = crypt($password, '$6$rounds=5000$'.$salt.'$');
$res_25 = crypt($password, '$6$rounds=2500$'.$salt.'$');
$res_5b = crypt($res_25, '$6$rounds=2500$'.$salt.'$');
echo ($res_5a==$res_5b); //should be true
我尝试使用 $res_25 字符串,但仍然无法获得我想要的结果。我假设 crypt() 用它做了一些不平凡的事情,并想知道是否有一种简单的方法可以做到这一点。
我打算通过以下方式使用它。当用户注册时,密码使用 5k 轮加密,结果存储在 DB 中(5k 只是一个例子,我们假设它足够安全)。盐帮助我们确保不能使用彩虹桌,而圆形可以保护我们免受蛮力攻击。如果数据库被盗,则无法解密密码,并且攻击者将无法在用户可能使用相同密码的其他地方使用这些密码。
我们的网站本身在登录表单上有“记住我”功能。不使用时,一切正常 - 我们将用户的状态存储在最终死掉的服务器会话中。但是,当用户想要使用“记住我”时,我们需要使用 cookie 来存储可用于对用户进行身份验证的数据。无论我们在 cookie 中存储什么 - 无论是原始密码还是 md5($res_5a) 之类的东西,如果攻击者窃取了 $res_5a 值并窃取了 cookie 创建背后的算法,他们将能够使用这些数据来伪造 cookie这将对用户进行身份验证。
我想做的是让登录表单创建 $res_25 cookie。然后每当加载页面时,服务器将添加 2.5k 更多迭代并检查该值是否与存储在数据库中的 $res_5a 匹配。这样,如果 $res_5a 被盗,攻击者将无法计算验证用户所需的 $res_25 值。