从无盐保证到盐渍MD5密码

Gir*_*mer 20 php md5

我有一个LAMP(PHP)网站正在变得流行.

我通过将用户密码存储为md5哈希来保证安全.

但我现在看到这不安全; 我应该腌制md5哈希 - 因为它目前可以使用彩虹表解码未加盐的md5哈希.

我能做什么?

我不想让每个人都输入新密码.

Hei*_*eld 21

您可以执行"两步散列",而不是一步创建散列.

您可以将每个密码哈希附加到用户名,然后再次哈希.这将创建一个不可加密的哈希值,该哈希值具有独特的信息.

通常的腌制过程是

salt + PWD - >哈希

你可以这样做:PWD - > Hash - > UserID + Hash - > Hash

(注意,UserID仅被选中,因此每个双哈希存在一个唯一的盐...随意让你的盐变得更复杂)


Jer*_*que 10

你可以在飞行中加盐.添加一段代码,以便当有人登录时,它执行正常过程(计算密码的MD5总和并根据存储的哈希检查它),如果成功,则从清除中重新计算哈希的盐渍版本输入的文本密码,并将其存储在密码文件中.

唯一的缺点是你需要添加一个指示器来确定每个MD5是否被腌制,因为你可以混合使用一段时间.或者,对于轻微的安全性损失,您可以检查每个密码和未加密的密码,如果有任何一个命中,请接受登录.当然,如果您检测到它是未加盐的,那么您在此时进行升级.


Sam*_*152 6

答案很简单,请确保在新的哈希系统中保留记录或某种用户标记的标记,下次登录时,验证它们,计算新哈希,翻转标记.

现在,只要有人登录并设置了标志,请使用新哈希对其进行身份验证.


Dom*_*ger 5

为什么不在new_pwd用户表中添加一个新列,用于存储结果md5($originallyHashOfPwd . $salt).然后,您可以预先计算new_pwd,一旦这样做了调整您的登录检查,以比较的结果md5(md5($entered_pwd) . $salt),以什么在new_pwd.完成切换登录检查后,删除旧列.

这应该会阻止彩虹表式攻击.

  • 完成后删除当前列! (3认同)

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)