众所周知,单向加密是加密数据库中用户密码的便捷方式。这样,即使数据库管理员也无法知道用户的密码,但必须输入密码,使用相同的算法对其进行加密,然后将结果与数据库中的加密密码进行比较。这意味着确定密码的过程需要大量的猜测和大量的处理能力。
看到计算机变得越来越快,数学家们仍在开发这些算法,我想知道考虑到现代计算能力和加密技术,哪一台最安全。
我几乎已经使用MD5几年了,我想知道是否还有更多我应该做的事情。我应该考虑不同的算法吗?
另一个相关问题:对于这样的加密密码,字段通常需要多长时间?我必须承认,我对加密几乎一无所知,但我假设MD5哈希(例如)可能更长,并且可能需要更多的处理能力才能破解。或者字段的长度根本不重要,前提是加密密码首先适合它?
答案 0 :(得分:58)
发现警告:由于这篇文章是在2010年编写的,因此GPU已被广泛部署到暴力密码哈希中。价格适中的GPU 每秒可以运行 100亿 MD5。这意味着即使是一个 完全随机的8个字符的字母数字密码(62个可能 人物)可以在6小时内强行逼迫。 SHA-1只是轻微的 慢一点,需要一天。您的用户密码要弱得多,而且 (即使是腌制)也会以每千个密码的速度下降 第二。散列函数设计为快速。你不想要这个 用于密码。使用scrypt,bcrypt或PBKDF-2。
MD5 在1996年较弱,而should not be used anymore则用于加密目的。 SHA-1 是常用的替代品,但has similar problems。 SHA-2 family哈希函数是SHA-1的当前replacement。 SHA-2的成员分别称为SHA-224,SHA-256,SHA-384和SHA-512。
目前,有几个散列函数are competing to become SHA-3,即下一个标准化的加密散列算法。将在2012年选出获胜者。这些都不应该使用!
对于密码哈希,您还可以考虑使用bcrypt之类的内容。它被设计得足够慢以使大规模暴力攻击变得不可行。您可以自己调整慢度,以便在计算机变得更快时使速度变慢。
警告: bcrypt基于较旧的双向加密算法Blowfish,目前存在更好的替代方案。我不认为bcrypt的加密哈希属性是完全可以理解的。如果我错了,有人会纠正我;我从来没有找到一个可靠的来源,从加密的角度来讨论bcrypt的属性(除了它的缓慢)。
对于密码散列而言,冲突风险比公钥加密或数字签名更少,这可能有些让人放心。今天使用MD5对于SSL来说是terrible idea,但对密码散列并不是同样灾难性的。但是如果你有选择的话,那就选择一个更强大的选择。
使用好的哈希函数not enough来保护您的密码。您应该将密码与长salts的cryptographically random一起哈希。如果可能,您还应该帮助您的用户选择更强的密码或密码短语。总是更好。
答案 1 :(得分:10)
好问题! This page是一本很好的读物。特别是,作者声称MD5不适合散列密码:
问题是MD5很快。它的现代竞争对手也是如此,例如SHA1和SHA256。速度是现代安全散列的设计目标,因为散列几乎是每个密码系统的构建块,并且通常在每个数据包或每个消息的基础上执行需求。
速度正是您在密码哈希函数中不想要的。
然后文章继续解释一些替代方案,并建议Bcrypt作为“正确的选择”(他的话,不是我的)。
免责声明:我根本没有尝试过Bcrypt。考虑这是一个友好的建议,但不能用我自己的技术经验来支持。
答案 2 :(得分:6)
要增加密码强度,您应该使用更多种类的符号。如果密码中有8-10个字符,则很难破解。虽然延长它会使它更安全,但只有使用数字/字母/其他字符。
SHA1是另一种哈希(单向加密)算法,速度较慢,但摘要较长。 (编码的消息)(160位)其中MD5只有128位。
然后SHA2更安全,但使用的更少。
答案 3 :(得分:3)
将密码保存为额外的防御级别
$salt = 'asfasdfasdf0a8sdflkjasdfapsdufp';
$hashed = md5( $userPassword . $salt );
答案 4 :(得分:3)
看到计算机变得越来越快,数学家们仍在开发这些算法
RSA加密是安全的,因为它依赖于非常大的数字 hard 来考虑因素。最终,计算机将足够快地在合理的时间内计算数字。为了保持领先,你使用更大的数字。
但是,对于大多数网站而言,散列密码的目的是使有权访问数据库的人能够不方便来读取密码,而不是提供安全性。为此目的,MD5很好 1 。
这里的含义是,如果恶意用户获得对整个数据库的访问权限,则他们不需要密码。 (前门上的锁不会阻止我进入窗户。)
1 仅仅因为MD5被“破坏”并不意味着你可以随时反转它。
答案 5 :(得分:1)
除了是加密安全的单向函数之外,用于密码保护的良好散列函数应该难以暴力 - 即设计缓慢。 scrypt是该领域最好的之一。从主页:
我们估计,在现代(2009)硬件上,如果花费5秒钟来计算派生密钥,那么针对scrypt的硬件暴力攻击的成本大约是针对bcrypt的类似攻击的成本的4000倍(至找到相同的密码),比对PBKDF2的类似攻击大20000倍。
也就是说,从常用的哈希函数中,对SHA系列中的任何事物进行几千次迭代都是对非关键密码的合理保护。
另外,总是添加一个盐,这样就无法共同努力,一次强制许多哈希。
答案 6 :(得分:0)
NIST目前正在举行竞选,以选择新的哈希算法,就像他们选择AES加密算法一样。因此,这个问题的答案在几年内可能会有所不同。
您可以查看提交内容并自行研究,看看是否有您想要使用的内容。