是否可以通过两次执行crypt(rounds=Y/2)来获得PHP crypt(rounds=Y)的结果

是否可以通过两次执行crypt(rounds=Y/2)来获得PHP crypt(rounds=Y)的结果,php,cryptography,md5,password-protection,password-encryption,Php,Cryptography,Md5,Password Protection,Password Encryption,我想要做的就是拥有这样的东西 $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字符串,但仍然不能得到我

我想要做的就是拥有这样的东西

$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值。

简介

它永远不会是一样的。。。因为在第二次
crypt
调用之后,您不再对原始
字符串进行哈希运算。。。我是什么意思

$salt = "salt";
$password = "password";
$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.'$');


var_dump($password,$res_5a,$res_25,$res_5b);
输出

string 'password' (length=8) <----------- Original Text

string '$6$rounds=5000$salt$IxDD3jeSOb5eB1CX5LBsqZFVkJdido3OUILO5Ifz5iwMuTS4XMS130MTSuDDl3aCI6WouIL9AjRbLCelDCy.g.' (length=106)
       |------------------|
         Custom Header for 500 rounds 

string '$6$rounds=2500$salt$e9Ui0CoNFtgwugogNU.uUwCKW8hAeW4td1ySwKf34FqEwMf2Gpk3zu5Y43R5a2AaI/5lpPigk1rSTme.uotYL1' (length=106)
       |------------------|
          Custom header would be added .. you are no onder encoding password

string '$6$rounds=2500$salt$JAq/IG3jH6w7r6S/AT/UhMpgLopLOWLbilJWY9z39s6To109QJvLxZJUkV99arSOSumFbS3Fy00CRAYrAd9Pp1' (length=106)
       |------------------|
         Even Final output would not be same as $6$rounds=5000$salt

根据PHP规范,crypt($string[,$salt]);我不知道你们在用“轮次”做什么,但(据我所知)这句话中的每一句话都会加上盐。(编辑:忽略这一点,我错了)是的,但即使在玩了$res_25、删除自定义标题并对无标题结果应用下一个2.5k迭代后,它仍然不起作用。是的,令牌可能就是我最终要做的。不过我希望有一个更简单的解决方案(只需再进行X次迭代):)这个循环就像一个文件指针。。当你到2500时。。。您不能从那里继续,当您再次调用它时,它将从0开始。增量值也会对加密产生影响
  session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
                                                   ^----- Http Only