如何安全地存储密码?

使用 bcrypt

用 bcrypt、用bcrypt、用bcrypt、用bcrypt、用bcrypt、用bcrypt、用bcrypt、用bcrypt、用bcrypt (重要的话就是要多多地重复几次)……

为什么不用 {MD5、 SHA1、 SHA256、 SHA512、 SHA-3 等加密算法}?

这些都是通用的hash函数,设计的初衷是为了尽可能快的计算大量数据的摘要。这意味着它们在保证数据完整性方面非常优秀但是对于存储密码则十分糟糕。

现代的服务器计算 MD5 的哈希值速度大概是每秒330MB。如果你的用户密码满足小写、数字字母混合、6个字符长这几个条件,你就可以在40秒内穷举出该密码。

完全不需要其他的投入。

如果你愿意花费2000美元和一到两周的时间来挑选一块支持 CUDA 的显卡,那你可以搭建一个小型的、每秒计算700,000,000个密码的超级计算机集群。估计你可以以每秒10%的速度来破解那些密码。

加盐也救不了你

注意了,非常重要的一点:hash加盐对于字典攻击和暴力破解无效。你可以用粗盐,或许多的盐,甚至是人工开采,阴凉的,有机的喜马拉雅粉晶盐。但这都无法影响到攻击者破解你密码的速度。

加盐与否,只要你用了为速度而设计的通用哈希函数,你就会受到影响。

bcrypt 解决了这些问题

怎么做呢?从根本上说,是因为它的(计算速度可以)慢到令人发指。它由 Blowfish 加密算法演变而来,并引入了功系数(work factor),以便让你能决定该哈希函数的计算强度。基于以上原因,bcrypt 可以紧随摩尔定律的脚步。计算机发展更快,你也可以增加功系数来让哈希更难计算。

比起 MD5,bcrypt 的计算强度能达到多大呢?这就要看功系数了。把功系数设为12情况下,在我的电脑上用 bcrypt 哈希 yaaa 这个密码大概要0.3秒。另一方面,用MD5 来处理要少于1微秒。

你的密码可能不需要那么高的安全级别,而需要更快的运算速度。幸好,bcrypt允许你在速度和安全之间进行平衡。

长话短说

用bcrypt.

本文由 伯乐在线 - zer0Black 翻译,Lingfeng Ai 校稿。
英文出处:codahale
译文链接:http://blog.jobbole.com/87058/

你可能感兴趣的:(java进阶)