我应该使用哪个密码哈希函数?

问题描述:

我正在寻找密码哈希函数,可以陪伴我多年。选择错误的可能是致命的,因为不可能在没有用户登录的情况下升级现有哈希。我应该使用哪个密码哈希函数?

通常建议使用glibc中的bcrypt或sha256-crypt。这些使用 key stretching, 但我不喜欢这个事实,我无法延长以后的伸展。 一个人应该能够跟上摩尔定律。

现在,我正在考虑维基百科链接中的简单算法,以及用于哈希函数的SHA-256。这让我可以继续添加迭代,因为我认为合适。

但是,该算法不是一个标准。因此,我不可能使用LDAP,htaccess等密码散列。

有更好的选择吗?

+0

不知道很多关于其他约束的问题,它不可能说 - 其应用程序涉及到它们将支持的内容 – symcbean 2011-03-31 12:28:18

您应该使用SHA1进行密码散列。但是,除了算法之外,还应该考虑将salt添加到密码中。理想情况下,应该为每个密码创建一个随机盐并与密码一起存储。

这是打败彩虹桌。在此

大讨论:Non-random salt for password hashes

+0

SHA-1被设计为快速,这使得它成为密码散列的一个不好的选择。 – Mark 2011-06-28 15:43:52

+0

@Mark:你能详细说明一下吗? – DuneCat 2012-09-13 14:01:25

+0

SHA-1的目标是获取一堆字节并快速生成密码安全哈希。 “快速”部分意味着蛮力搜索比使用慢散列函数更快。最好的办法是使用带有许多迭代的密钥派生函数,因为它们专门设计需要很长时间来计算。 – Mark 2012-09-13 16:01:33

我可以在此现身,从另一个角度,但如果你说你可能谁也不会登录的时间再长周期呈现很大的风险用户。您允许用户使用相同密码的时间越长,攻击者设法以某种方式获取密码哈希文件的暴力威胁就越大。不要依靠安全防止发生......

散列函数不会过时,所以我想你应该很好地审查这个每年,希望你会让你的用户更改密码比这更频繁。

这一切都取决于您的具体要求,显然,但有一个思考。

一般来说bcrypt或sha256都可以很好地满足要求。

更新:您可以考虑将此查询弹出到security.stackexchange.com,因为这是一个安全管理问题。

+0

一个好的散列的整个想法是,即使有人不抓取散列,他们也不会做反向查找。无论哪种方式,无论您使用什么算法,糟糕的密码都会被破解。糟糕的协议使用良好的哈希也容易受到重播攻击或传递哈希攻击。除了使用哪个散列之外,还有很多其他的东西。 – Marcin 2011-03-31 14:35:54

+0

@Marcin - 忘记反向查找。我正在根据OP查看时间角度。暴力强制发生 - 更好的散列函数使用时间更长,但OP似乎允许很长时间。我同意你的其他观点 - 而目前的想法表明,现在对于大多数目的而言,bcrypt和sha256都是合适的。 – 2011-03-31 14:47:32

+0

为什么不有帐户到期? – Slartibartfast 2011-04-01 02:47:52