快速哈希算法破坏了加密的安全性

像MD5、SHA和SHA1之类的快速哈希算法的用意并不在安全性——保护重要的信息,特别是密码,哈希算法必须有意地减慢反向暴力破解速度。Troy Hunt是一位微软的MVP,它演示了SqlMembershipProvider所提供的密码哈希值如何易于被暴力破解。

SqlMembershipProvider是VS 2010中ASP.NET web应用程序模板中的默认成员(membership)提供程序。Troy在他的文章《我们的密码哈希值没有遮挡(Our password hashing has no clothes)》中演示了经过SqlMembershipProvider中SHA1哈希算法处理的密码安全性是如何被破解的,其中使用的是GPU、名为hashkiller的字典以及暴力破解算法。在规模为40000条的真实密码样本中(来自于之前的一次攻击),算法在45分钟内破解了24710个,占总体样本的67%。 其中包括被认为是很强壮的密码:

像“volleyball6”,有11个字符,两种字符类型。甚至还有“zaq1@WSX”——由八个字符组成,其中有大写、小写、数字和符号,肯定足以通过大多数安全策略,但是即便被存储为“安全的”哈希值,也完全没用。

问题在于你拥有了可能的密码字典之后可以快速创建新的哈希值,并且硬件变得越来越快。

那么如何来解决这个问题呢? 密钥延伸(Key stretching),通过多次迭代哈希算法,能够提供一种方式来让哈希算法变得足够慢,使得暴力破解更加困难。BcryptPBKDF2都是这样的算法——它们叫做适应性算法,因为通过增加迭代的次数,会随着时间推移而变得更慢(因为硬件变得更快)。Bcrypt.NET实现了前者,而DefaultMembershipProvider实现了后者。 DefaultMembershipProvider对SHA1使用了1000次迭代,它是VS2012的ASP.NET MVC 4模板政所提供的默认选项。Troy的文章《.NET中更强的密码哈希算法(Stronger password hashing in .NET)》说明了如何使用这些方法,以及如何把应用程序迁移到使用更强壮的哈希算法,而不会破坏你的身份验证过程。

你可能感兴趣的:(算法)