MD5,密码哈希和盐位置

Vla*_*mos 2 php hash md5 salt

在我开始之前,我知道MD5受到了损害(碰撞攻击和散列速度)并且不应该用于哈希密码,但只是为了它,请耐心等待.

我的问题是:使用md5进行散列时的盐位置如何影响散列的"质量"或"强度"?

假设我有以下代码,使用他的电子邮件地址的一部分作为salt哈希用户密码:

<?php
    $email = 'user@emailservice.ex';
    $password = 'RandomPassWithChars';

    $segments = explode('@', $email);
    list($saltPart1, $saltPart2, $saltPart3) = $segments;

    $hash = md5($saltPart1.$password.$saltPart3.$saltPart2);
?>
Run Code Online (Sandbox Code Playgroud)

该代码是否会减慢蛮力/字典/彩虹表攻击,而不是说:

<?php
    $password = 'RandomPass';
    $salt     = 'RandomSaltStoredInTheDatabase';
    $hash = md5($password, $salt);
?>
Run Code Online (Sandbox Code Playgroud)

是否值得尝试像第一个代码中那样加密密码,或者它与第二个代码的结果相同?这有什么好处吗?第一个代码延迟破解密码列表是否比第二种方式更快?

这引出了第二个问题:在数据库中存储盐是否比从用户ID(例如电子邮件地址)获取盐更安全?我看到它的方式,一旦攻击者获得了数据库的副本,该数据库也保留了盐,这使他的生活变得有点轻松,试图破解哈希.但是如果没有储存盐,攻击者也需要创造盐的算法.如果我错了,请纠正我.

我希望我清楚自己.感谢您提前得到任何答案.

Ken*_*rey 8

第一个问题:

salt的位置对特定哈希的安全性没有影响.良好的散列函数具有完美的熵,因为对于每个输入位改变,每个输出位具有50%的改变机会.

某个订单的任何可能的安全性好处完全取决于用于将盐与预期密码连接的算法的相对慢度(例如,如果"password" . "salt""salt" . "password"使用前者慢,则使用前者).但是,大多数编程语言都没有那种性能"问题".

第二个问题:

如果salt明确存储在数据库中,攻击者将知道salt,并能够发起暴力哈希攻击.如果盐是未知的,仍然可以使用暴力密码攻击(尽管通过在尝试之间插入延迟很容易使其无效).此外,攻击者可能能够对程序进行反向工程并检索哈希字段.

至于哈希的安全性,如果用户在两个不同的地方具有相同的电子邮件和密码,则这否定了随机盐的一个好处,因为两个地方都可以看到相同的哈希.

就个人而言,我认为散列的最佳方法是使用:

"password" . "salt" . "internalconstantvalue"
Run Code Online (Sandbox Code Playgroud)

这样做的好处是简单,并且不比大多数其他安全方法安全.

  • +1为""密码"."盐" ."internalconstantvalue",这在盐教程中从未出现过 (4认同)