首页 文章

MD5,密码哈希和盐位置

提问于
浏览
2

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

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

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

<?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(例如电子邮件地址)获取盐更安全?我看到它的方式,一旦攻击者获得了数据库的副本,该数据库也能保留盐,这使得他的生活变得有点轻松,试图破解哈希 . 但是如果没有存储盐,攻击者也需要创建盐的算法 . 如果我错了,请纠正我 .

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

3 回答

  • 0

    第一个问题:

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

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

    第二个问题:

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

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

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

    "password" . "salt" . "internalconstantvalue"
    

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

  • 1

    这取决于攻击者是否试图绕过您的安全性,或者他是否试图找到密码 .

    由于哈希算法的加密弱点,如果攻击者依赖于找到与数据库的给定哈希值的冲突,那么salt将没有任何影响:我有一堆比特,我想找到一些输入到XXX哈希算法,它在输出中给出了相同的一串位 .

    如果他试图通过尝试每种可能的组合来强制密码,那么他可以在原始密码上收集的任何信息都将有助于:

    • 长度

    • 构图(字母数字字符,特殊符号,......)

    • ......

    通过创建自己的salt算法,您实际上是在尝试通过模糊处理来实现安全性,这确实是任何不加强哈希算法的人 .

  • 7

    当您处理密码安全性时,请始终假设如果攻击者可以访问您的数据库,那么他可以访问您的代码 .

    因此,当涉及到salting时,只需生成随机值的哈希值(例如, mcirotime() )并在散列之前使用它来密码密码并将其存储在密码旁边的列中的数据库中 .

    在将密码添加到密码时,我的个人意见是,如果你把它放在第一个或最后一个或中间并不重要 .

    你想要安全吗?然后使用慢哈希算法,我强烈推荐使用PHPass,因为它使用 bcrypt (基于Blowfish)作为默认的哈希算法 .

相关问题