众所周知,单向加密是加密数据库中用户密码的便捷方法。这样,即使数据库的管理员也无法知道用户的密码,但是必须进行密码猜测,使用相同的算法对其进行加密,然后将结果与数据库中的加密密码进行比较。这意味着找出密码的过程需要大量的猜测和大量的处理能力。
看到计算机的速度越来越快,而数学家仍在开发这些算法,我想知道考虑到现代计算能力和加密技术,哪一种是最安全的。
我已经几乎只使用MD5多年了,我想知道是否还有其他事情要做。我应该考虑使用其他算法吗?
另一个相关问题:这样的加密密码字段通常应保留多长时间?我必须承认,我几乎对加密一无所知,但是我假设MD5哈希(例如)可以更长,并且可能需要更多的处理能力才能破解。还是假设加密密码首先适合该字段,字段的长度根本没有关系吗?
警告: 自从此文章撰写于2010年以来,GPU已广泛部署到暴力破解密码哈希。价格适中的GPU 每秒可以运行 一百亿个 MD5。这意味着即使是完全随机的8个字符的字母数字密码(62个可能的字符)也可以在6小时内被强行使用。SHA-1只会稍微慢一点,需要一天的时间。您用户的密码要弱得多,并且(即使加盐)也会以每秒数千个密码的速度下降。哈希函数 设计得很快 。您不需要此密码。使用scrypt,bcrypt或PBKDF-2。
MD5 在1996年被发现是较弱的,因此不应再用于加密目的。 SHA-1 是常用的替代品,但存在类似的问题。在 SHA-2 家族的散列函数的当前替换SHA-1的。SHA-2的成员分别称为SHA-224,SHA-256,SHA-384和SHA-512。
目前,一些哈希函数正在竞争成为 SHA-3 (下一个标准化的密码哈希算法)。2012年将选出一名优胜者。这些都不可使用!
对于密码哈希 ,您还可以考虑使用 bcrypt之类的 东西。它的设计速度足够慢,无法进行大规模的暴力攻击。您可以自己调整速度,以便在计算机变快时将其变慢。
警告: bcrypt基于较旧的双向加密算法Blowfish,如今,存在更好的替代方法。我认为bcrypt的加密哈希属性尚未完全理解。如果我错了,有人纠正我。我从未找到从加密角度讨论bcrypt属性(除了其慢度)的可靠来源。
在某种程度上可以肯定的是,对于密码散列而言,冲突的风险要比对公钥密码术或数字签名而言更为重要。对于SSL来说,今天使用MD5是一个糟糕的主意,但对于密码散列而言却并非同样灾难。但是,如果您有选择,只需选择一个更强大的选择。
使用好的哈希函数不足以保护密码。您应该将密码与长且加密随机的 盐 一起散列。如果可能,您还应该帮助用户选择更强的密码或密码。越长越好。