在我开始之前,我知道 MD5 已被破坏(碰撞攻击和散列速度)并且不应该用于散列密码,但只是为了它,请耐心等待。
我的问题是:使用 md5 散列时的盐位置如何影响散列的“质量”或“强度”?
假设我有以下代码,它使用他的电子邮件地址的一部分作为盐来散列用户密码:
<?php
$email = 'user@emailservice.ex';
$password = 'RandomPassWithChars';
$segments = explode('@', $email);
list($saltPart1, $saltPart2, $saltPart3) = $segments;
$hash = md5($saltPart1.$password.$saltPart3.$saltPart2);
?>
该代码是否会减慢蛮力/字典/彩虹表攻击,而不是说:
<?php
$password = 'RandomPass';
$salt = 'RandomSaltStoredInTheDatabase';
$hash = md5($password, $salt);
?>
是否值得尝试像在第一个代码中那样对密码进行加盐,或者它会产生与第二个代码相同的结果?有什么好处吗?第一个代码是否比第二种方式延迟破解以这种方式散列的密码列表?
这就引出了第二个问题:将盐存储在数据库中是否比从用户 ID(例如电子邮件地址)获取盐安全?在我看来,一旦攻击者获得了数据库的副本,该副本也包含盐,它使他的生活更容易尝试破解哈希。但是如果不存储盐,攻击者还需要创建盐的算法。如果我错了,请纠正我。
我希望我说清楚了。感谢您提前提供任何答案。