我想做这样的事情
$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只是一个例子,让我们假设它足够安全)。 Salt帮助我们确保彩虹表不能被使用,而圆形保护我们免受蛮力。如果数据库被盗,则无法解密密码,并且攻击者将无法在用户可能使用相同密码的其他地方使用这些密码。
我们网站本身在登录表单上有“记住我”功能。当它没有被使用时,一切都很好 - 我们将用户的状态存储在最终死亡的服务器会话中。但是,当用户想要“记住我”时,我们需要使用cookie来存储可用于验证用户身份的数据。无论我们存储在cookie中 - 无论是原始密码还是类似md5($ res_5a),如果攻击者窃取$ res_5a值并窃取创建cookie的算法,他们将能够使用此数据伪造cookie这将验证用户身份。
我想要做的是登录表单创建$ res_25 cookie。然后,无论何时加载页面,服务器将添加2.5k以上的迭代并检查该值是否与存储在DB中的$ res_5a匹配。这样,如果$ res_5a被盗,攻击者将无法计算验证用户所需的$ res_25值。
答案 0 :(得分:1)
<强>简介强>
它永远不会相同...因为在第二次string
通话后你不再对原始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
解决方案
更好的方法是使用安全性令牌哈希,并且永远不会存储用户名&amp;或系统上的密码
令牌可能在哈希组合中有User Agent
,OS
,Screen Resolution
,以确保您处于相同的环境中
同时尝试使用Http_only Cookie示例属于Security Implications
session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
^----- Http Only