Improve password hashing with a random salt
我正在启动一个网站,我正试图决定如何加密用户密码以将其存储在SQL数据库中。
我认识到使用简单的MD5(密码)是非常不安全的。我正在考虑使用sha512(password.salt),我一直在研究生成有用salt的最佳方法。我读了很多文章,说salt应该是尽可能随机的,以便向哈希添加熵,这看起来是一个好主意。但是:
- 你需要把随机盐和土豆泥一起储存起来
- 假设攻击者以某种方式访问了您的散列密码(并试图将散列转换为纯文本),这意味着他可能会丢弃您的数据库,然后访问您的随机salt
数据库中散列旁边看起来奇怪的值不是很明显吗?如果攻击者可以访问salt和散列值,那么该如何更安全呢?
有人在这方面有专长吗?谢谢!
攻击者"被允许"知道SALT——您的安全性设计必须确保即使知道SALT,它仍然是安全的。
盐有什么作用?
盐可以帮助防御暴力攻击,使用预先计算的"彩虹表"。
对于攻击者来说,salt使得暴力破解的成本(时间/内存方面)要高得多。
计算这样一个表是昂贵的,通常只在它可以用于多个攻击/密码时才进行计算。
如果您对所有密码都使用相同的salt,攻击者可以预先计算这样一个表,然后将您的密码强制转换为明文…< BR>只要为要存储哈希值的每个密码生成一个新的(最好的密码强)随机salt,就没有问题。
如果您想进一步加强安全性
你可以多次计算散列(散列散列等)-这不会花费你很多,但它使暴力攻击/计算"彩虹表"更加昂贵…请不要自己发明-有行之有效的标准方法可以做到这一点,例如http://en.wikipedia.org/wiki/pbkdf2和http://www.itnewb.com/tutorial/encrypting-passwords-with-php-for-storage-using-the-rsa-pbkdf2-standard。
注:
如今,使用这种机制是强制性的,因为"CPU时间"(可用于彩虹表/蛮力等攻击)的可用性越来越广泛(例如,亚马逊的云服务是全球最快的50个超级互斥器中的前50个,任何人都可以以相对较小的数量使用这一事实)!
given that an attacker somehow got access to your hashed passwords
(and is trying to reverse the hash to plain text), it means he
probably dumped your database, then got access to your random salts
also
号
腌制的关键是击败"彩虹桌":
http://en.wikipedia.org/wiki/rainbow_表格
看看为什么一个足够长的盐击败任何彩虹表下的"防御彩虹表"。
how is that more secure?
号
它以前更安全,因为它迫使攻击者尝试一种非常昂贵的蛮力方法,而不是在预先计算的彩虹表中立即查看。如果您有一个64位的salt,攻击者需要有2^64个预先计算的彩虹表而不是一个…换句话说:它使彩虹桌变得毫无用处。
然而,请注意,现代GPU每秒可以破解数十亿个密码,这使得攻击者存储巨大的彩虹表(而不是存储数十亿个哈希,只需在几秒钟内计算它们)几乎毫无意义。
现在,你想用pbkdf2或scrypt之类的东西来存储你的"密码"。
下面的问题来自姐妹站点Security StackExchange。他们讨论哈希、盐、pbkdf2、bcrypt、scrypt和其他一些事情。
- 如何安全地散列密码?
- 是否有安全专家建议使用bcrypt进行密码存储?
这里还有一些以前关于stackoverflow的讨论:
BCRYPT是一种很好的哈希算法吗?我在哪里能找到它?
简而言之,salt是一种保护措施,它使在发生妥协时恢复密码需要很长时间,就像哈希一样。如果攻击一个密码,salt就不会有什么区别。如果试图同时使用预先计算好的字典或测试许多密码,则为每个条目使用不同的salt将大大增加所需的工作量,并且通常会使生成合适的彩虹表变得不可行。
您的哈希密码和salt密码的强度取决于以下所有因素:
- 哈希算法的优势
- 盐的随机性
- 密码的随机性
你的系统和上述最薄弱的系统一样强大。
下面是一篇关于密码术的好文章:http://www.javacodegeeks.com/2012/02/introduction-to-strong-cryptography-p1.html
有关salt的讨论,请参见场景1"哈希算法的真实世界用法"一节。
我强烈建议使用http://docs.oracle.com/javase/6/docs/api/java/security/securelrandom.html生成您的salt