61

众所周知,单向加密是一种在数据库中加密用户密码的便捷方式。这样,即使是数据库的管理员也无法知道用户的密码,而是必须猜测密码,使用相同的算法对其进行加密,然后将结果与数据库中的加密密码进行比较。这意味着找出密码的过程需要大量的猜测和强大的处理能力。

看到计算机越来越快,而数学家仍在开发这些算法,我想知道考虑到现代计算能力和加密技术,哪一个是最安全的。

多年来,我几乎一直在使用 MD5,我想知道我是否应该做更多的事情。我应该考虑使用不同的算法吗?

另一个相关问题:对于这样的加密密码,字段通常应该多长时间?我必须承认我对加密几乎一无所知,但我假设 MD5 哈希(例如)可能更长,并且可能需要更多的处理能力来破解。或者字段的长度根本不重要,前提是加密的密码首先适合它?

4

7 回答 7

61

警告:自从这篇文章写于 2010 年以来,GPU 已被广泛用于暴力破解密码哈希。价格适中的 GPU每秒可以运行100 亿个 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 的属性(除了它的缓慢性)。

冲突风险对于密码散列的重要性不如对公钥密码学或数字签名的重要性,这可能有点让人放心。今天使用 MD5 对于 SSL 来说是一个糟糕的主意,但对于密码散列来说却不是同样灾难性的。但是,如果您有选择,只需选择一个更强大的。

使用良好的散列函数不足以保护您的密码。您应该将密码与长且加密随机的一起散列。如果可能,您还应该帮助您的用户选择更强的密码或密码短语。越长越好。

于 2010-02-24T21:34:31.877 回答
10

好问题! 这个页面是一个很好的阅读。特别是,作者声称 MD5 不适合散列密码:

问题是 MD5 速度很快。它的现代竞争对手也是如此,例如 SHA1 和 SHA256。速度是现代安全散列的设计目标,因为散列是几乎每个密码系统的构建块,并且通常在每个数据包或每个消息的基础上按需执行。

速度正是您在密码哈希函数中不想要的。

然后文章继续解释了一些替代方案,并推荐Bcrypt作为“正确的选择”(他的话,不是我的话)。

免责声明:我根本没有尝试过 Bcrypt。认为这是一个友好的建议,但不是我可以用我自己的技术经验支持的东西。

于 2010-02-24T21:29:52.117 回答
6

要提高密码强度,您应该使用更多种类的符号。如果密码中有 8-10 个字符,则很难破解。尽管延长它会使其更安全,但前提是您使用数字/字母/其他字符。

SHA1 是另一种散列(单向加密)算法,速度较慢,但​​摘要较长。(编码消息)(160 位)其中 MD5 只有 128 位。

那么 SHA2 就更安全了,但它使用的更少。

于 2010-02-24T21:21:59.233 回答
4

加盐密码始终是额外的防御措施

$salt = 'asfasdfasdf0a8sdflkjasdfapsdufp';
$hashed = md5( $userPassword . $salt );
于 2010-02-24T21:26:47.000 回答
3

看到计算机越来越快,而数学家仍在开发这些算法

RSA 加密是安全的,因为它依赖于一个很难分解的非常大的数字。最终,计算机将变得足够快,可以在合理的时间内计算出这个数字。为了保持领先地位,您可以使用更大的数字。

然而,对于大多数网站来说,散列密码的目的是让有权访问数据库的人不方便读取密码,而不是提供安全性。为此,MD5 很好1

这里的含义是,如果恶意用户获得了对整个数据库的访问权限,他们就不需要密码。(前门的锁不会阻止我进入窗户。)


1仅仅因为 MD5 被“损坏”并不意味着您可以随时反转它。

于 2010-02-24T21:53:08.173 回答
2

除了是一种密码安全的单向函数外,一个好的密码保护散列函数应该是难以暴力破解的——即设计上很慢。scrypt是该领域最好的之一。从主页:

我们估计,在现代(2009 年)硬件上,如果花费 5 秒计算派生密钥,则针对 scrypt 的硬件暴力攻击的成本大约是针对 bcrypt 的类似攻击成本的 4000 倍(找到相同的密码),并且比针对 PBKDF2 的类似攻击大 20000 倍。

也就是说,从常用的哈希函数中,对 SHA 系列中的任何内容进行数千次迭代对于非关键密码的保护是相当合理的。

此外,请始终添加盐,以使一次无法分担暴力强制多个哈希的努力。

于 2010-02-24T21:55:31.663 回答
0

NIST 目前正在举办一场比赛来选择一种新的散列算法,就像他们选择 AES 加密算法一样。所以这个问题的答案可能在几年后会有所不同。

您可以查看提交的内容并自己研究它们,看看是否有您想要使用的内容。

于 2010-02-24T21:31:46.887 回答