一尘不染

很多哈希迭代:每次都添加盐吗?

php

我已经使用了无盐的md5 /
sha1很长时间了,但是由于这种方法并不真正安全(随着时间的流逝,它变得越来越不安全),我决定改用盐腌的sha512。此外,我想通过使用许多迭代(例如100)来减慢哈希的生成。

我的问题是我应该在每次迭代中添加盐还是在开始时仅添加一次。这是两个可能的代码:

每次附加:

// some nice big salt
$salt = hash($algorithm, $salt);

// apply $algorithm $runs times for slowdown
while ($runs--) {
    $string = hash($algorithm, $string . $salt, $raw);
}

return $string;

追加一次:

// add some nice big salt
$string .= hash($algorithm, $salt);

// apply $algorithm $runs times for slowdown
while ($runs--) {
    $string = hash($algorithm, $string, $raw);
}

return $string;

我首先想使用第二个版本(添加一次),但是随后发现每次添加盐的一些脚本。

因此,我想知道是否每次都添加它会增加哈希值的强度。例如,攻击者是否有可能找到某种聪明的方法来创建100timesSha512函数,而该方法比仅执行sha512
100次要快得多?


阅读 360

收藏
2020-05-29

共1个答案

一尘不染

简而言之:是的。以第一个示例为例…如果在不添加原始数据的情况下将其反馈给自身,则哈希函数可能会失去熵(我现在似乎找不到引用,我会继续寻找)。

根据记录,我多次支持哈希。

花费500毫秒才能生成的哈希对于您的服务器而言并不太慢(考虑到生成哈希通常不会完成绝大多数请求)。但是,花费这么长时间的哈希将显着增加生成彩虹表所需的时间…

是的,它确实暴露了DOS漏洞,但是它还可以防止暴力攻击(或至少使攻击速度过慢)。绝对需要权衡,但从某些方面来说,收益会超过风险。

整个过程的参考(更像是概述):重点加强

至于退化的碰撞,到目前为止,我唯一能找到的就是这种讨论

有很多结果。如果您想要更多,请使用Google hash stretching…那里有大量的有用信息…

2020-05-29