什么是目前最安全的单向encryptionalgorithm?

众所周知,单向encryption是对数据库中的用户密码进行encryption的一种便捷方式。 这样,即使数据库的pipe理员也不能知道用户的密码,但必须进行密码猜测,使用相同的algorithm对其进行encryption,然后将结果与数据库中的encryption密码进行比较。 这意味着确定密码的过程需要大量的猜测和大量的处理能力。

看到计算机正在变得越来越快,math家仍在开发这些algorithm,我想知道考虑到现代计算能力和encryption技术,哪一个是最安全的。

我一直使用MD5已经有几年了,现在我想知道是否还有更多我应该做的事情。 我应该考虑一个不同的algorithm?

另一个相关的问题:一个字段通常需要多长时间才能获得这样的encryption密码? 我必须承认,我几乎不知道encryption,但我假设一个MD5散列(作为例子)可能会更长,并可能需要更多的处理能力来破解。 或者,字段的长度根本不重要,只要encryption的密码适合于它呢?

警告:由于这篇文章是在2010年编写的,GPU已经被广泛部署到暴力破解密码中。 价格适中的GPU每秒可以运行100亿个 MD5。 这意味着即使是一个完全随机的8个字符的字母数字密码(62个可能的字符)也可以在6个小时内被强制使用。 SHA-1只是稍微慢一点,需要一天的时间。 你的用户的密码要弱得多,而且(即使是腌制)的密码速度也会以每秒数千个密码的速度下降。 哈希函数被devise得很快 。 你不想要这个密码。 使用scrypt,bcrypt或PBKDF-2。

MD5在1996年被发现是微弱的, 不应再用于密码学的目的。 SHA-1是一种常用的替代品,但也有类似的问题 。 SHA-2散列函数系列是当前SHA-1的替代品 。 SHA-2的成员分别被称为SHA-224,SHA-256,SHA-384和SHA-512。

目前,一些散列函数正在竞相成为下一个标准化的密码散列algorithmSHA-3 。 获胜者将在2012年被选中。这些都不应该使用!

对于密码哈希 ,你也可以考虑使用类似bcrypt的东西。 它的devise足够慢,使大规模暴力攻击不可行。 你可以自己调整慢度,所以当电脑变得更快时,它可以变慢。

警告: bcrypt是基于一个较旧的双向encryptionalgorithmBlowfish,现在有更好的select。 我不认为bcrypt的密码散列属性是完全理解的。 有人纠正我,如果我错了; 我从来没有find一个可靠的来源,从encryption的angular度来讨论bcrypt的属性(除了其缓慢)。

对于密码散列而言,冲突的风险可能比公钥密码或数字签名的风险稍低一些。 今天使用MD5对于SSL来说是一个糟糕的主意 ,但对于密码哈希来说,并不是同样的灾难。 但是,如果你有select,只需select一个更强大的。

使用一个好的散列函数是不够的,以确保您的密码。 你应该把密码与长密码随机的 混在一起。 如果可能,还应该帮助用户select更强的密码或通过短语。 总是更好。

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

问题是MD5很快。 它的现代竞争者也是如此,比如SHA1和SHA256。 速度是现代安全散列的devise目标,因为散列几乎是每个密码系统的构build块,并且通常以每个数据包或每个消息为基础进行需求执行。

速度正是你不想在密码哈希函数。

然后文章继续解释一些替代scheme,并build议Bcrypt作为“正确的select”(他的话,不是我的)。

免责声明:我还没有尝试过Bcrypt。 考虑一下这个友好的build议,但不是我可以用自己的技术经验来备份的。

要增encryption码强度,您应该使用更多种类的符号。 如果你有8-10个字符的密码,就很难破解。 尽pipe如此,只要使用数字/字母/其他字符,使其变得更加安全。

SHA1是另一种哈希(单向encryption)algorithm,速度较慢,但​​是具有较长的摘要。 (编码消息)(160位),其中MD5只有128位。

那么SHA2更安全,但使用更less。

腌制密码永远是一个额外的防御水平

$salt = 'asfasdfasdf0a8sdflkjasdfapsdufp'; $hashed = md5( $userPassword . $salt ); 

看到计算机正在变得更快,math家仍在开发这些algorithm

RSAencryption是安全的,因为它依赖于一个非常大的数字难以分解。 最终,计算机将会在足够的时间内快速分解数字。 为了保持在曲线之前,你使用一个更大的数字。

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

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


1只是因为MD5是“破”并不意味着你可以随时扭转它。

除了密码安全的单向函数之外,密码保护的一个好的散列函数应该很难暴力破解,也就是说devise缓慢。 scrypt是该领域最好的之一。 从主页:

我们估计在现代(2009)的硬件上,如果计算一个派生密钥需要5秒钟,那么对scrypt的硬件暴力攻击的代价大约是类似bcrypt攻击的代价的4000倍密码),比对PBKDF2的类似攻击大20000倍。

也就是说,从通常可用的散列函数中,对SHA进行数千次迭代是非关键密码的合理保护。

另外,总是添加一个盐,使它不可能共同努力,一次强制多个哈希值。

NIST正在进行一场比赛来select一个新的哈希algorithm,就像他们selectAESencryptionalgorithm一样。 所以这个问题的答案在几年内可能会有所不同。

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