我已经使用了无盐的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次要快得多?
简而言之:是的。以第一个示例为例…如果在不添加原始数据的情况下将其反馈给自身,则哈希函数可能会失去熵(我现在似乎找不到引用,我会继续寻找)。
根据记录,我多次支持哈希。
花费500毫秒才能生成的哈希对于您的服务器而言并不太慢(考虑到生成哈希通常不会完成绝大多数请求)。但是,花费这么长时间的哈希将显着增加生成彩虹表所需的时间…
是的,它确实暴露了DOS漏洞,但是它还可以防止暴力攻击(或至少使攻击速度过慢)。绝对需要权衡,但从某些方面来说,收益会超过风险。
整个过程的参考(更像是概述):重点加强
至于退化的碰撞,到目前为止,我唯一能找到的就是这种讨论。
有很多结果。如果您想要更多,请使用Google hash stretching…那里有大量的有用信息…
hash stretching