我有一个LAMP(PHP)网站正在变得流行.
我通过将用户密码存储为md5哈希来保证安全.
但我现在看到这不安全; 我应该腌制md5哈希 - 因为它目前可以使用彩虹表解码未加盐的md5哈希.
我能做什么?
我不想让每个人都输入新密码.
Hei*_*eld 21
您可以执行"两步散列",而不是一步创建散列.
您可以将每个密码哈希附加到用户名,然后再次哈希.这将创建一个不可加密的哈希值,该哈希值具有独特的信息.
通常的腌制过程是
salt + PWD - >哈希
你可以这样做:PWD - > Hash - > UserID + Hash - > Hash
(注意,UserID仅被选中,因此每个双哈希存在一个唯一的盐...随意让你的盐变得更复杂)
Jer*_*que 10
你可以在飞行中加盐.添加一段代码,以便当有人登录时,它执行正常过程(计算密码的MD5总和并根据存储的哈希检查它),如果成功,则从清除中重新计算哈希的盐渍版本输入的文本密码,并将其存储在密码文件中.
唯一的缺点是你需要添加一个指示器来确定每个MD5是否被腌制,因为你可以混合使用一段时间.或者,对于轻微的安全性损失,您可以检查每个密码和未加密的密码,如果有任何一个命中,请接受登录.当然,如果您检测到它是未加盐的,那么您在此时进行升级.
为什么不在new_pwd用户表中添加一个新列,用于存储结果md5($originallyHashOfPwd . $salt).然后,您可以预先计算new_pwd,一旦这样做了调整您的登录检查,以比较的结果md5(md5($entered_pwd) . $salt),以什么在new_pwd.完成切换登录检查后,删除旧列.
这应该会阻止彩虹表式攻击.
kni*_*ttl -1
遗憾的是,您唯一的方法是告诉您的用户更新密码。
您也可以生成随机密码,但这同样很麻烦。
编辑
您可以对存储的密码进行双重编码。所以你的新加盐哈希算法将是:
md5(md5($new_password).$salt).':'.$salt
Run Code Online (Sandbox Code Playgroud)
要更新您的旧密码,请使用
md5($old_password.$salt).':'.$salt
Run Code Online (Sandbox Code Playgroud)
要检查提供的密码是否正确,只需使用
list($stored_password, $salt) = explode(':', $salted_password);
if(md5(md5($provided_password).$salt) == $stored_password) {
// you are now logged in
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8518 次 |
| 最近记录: |