我正在创建一个网站,我正在尝试决定如何加密用户密码以将其存储在SQL数据库中。
我意识到使用简单的md5(密码)是非常不安全的。我正在考虑使用sha512(password.salt),我一直在研究生成有用盐的最佳方法。 我阅读了很多文章,声明盐应该尽可能随机地添加熵到哈希,这看起来是个好主意。但是:
数据库中散列旁边的怪异外观值是不是很明显?如果攻击者可以使用哈希值访问salt,那么它更安全吗?
任何人都有该领域的专业知识吗?谢谢!
答案 0 :(得分:40)
攻击者“允许”知道盐 - 您的安全性必须设计为即使知道盐仍然是安全的。
盐有什么作用?
Salt使用预先计算的“彩虹表”帮助抵御暴力攻击
对于攻击者来说,盐使蛮力更加昂贵(在时间/记忆方面)
计算这样一个表是很昂贵的,通常只有当它可以用于多个攻击/密码时才会这样做
如果您对所有密码使用相同的盐,则攻击者可以预先计算此类表格,然后将您的密码暴力强制为明文...
只要你为每个密码生成一个新的(最好的cryptogrpahically强)随机盐你想存储哈希就没有问题。
如果您想进一步加强安全性
你可以多次计算哈希值(散列哈希等) - 这不会花费你太多但是它会使暴力攻击/计算“彩虹表”更加昂贵......请不要发明自己 - 已经过验证的标准方法,例如参见http://en.wikipedia.org/wiki/PBKDF2和http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage-Using-the-RSA-PBKDF2-Standard
注意:
现在使用这样的机制是 mandatrory ,因为“CPU时间”(可用于彩虹表/蛮力等攻击)正变得越来越广泛(参见例如亚马逊的云服务是全球速度最快的超级用户中的前50名之一,任何人都可以使用相对较少的数量)!
答案 1 :(得分:15)
鉴于攻击者以某种方式访问了您的哈希密码 (并试图将哈希值反转为纯文本),这意味着他 可能会丢弃您的数据库,然后可以访问您的随机盐 还
腌制的全部意义在于打败“彩虹桌”:
http://en.wikipedia.org/wiki/Rainbow_table
了解为什么足够长的盐会在“防御彩虹表”部分下击败任何彩虹表。
怎么更安全?
它曾经更安全,因为它迫使攻击者尝试当时非常昂贵的蛮力方法,而不是在预先计算的彩虹表中查看。如果你有一个64位的盐,攻击者需要有2 ^ 64个预先计算的彩虹表而不是一个...换句话说:它使彩虹表无用。
但是请注意,现代GPU每秒可以破解数十亿个密码,这使得攻击者存储巨大的彩虹表(而不是存储数十亿个哈希值,只需在几秒钟内计算出来)就毫无意义。
现在你想使用像PBKDF2或scrypt这样的东西存储你的“密码”。
答案 2 :(得分:0)
散列密码密码的强度取决于以下所有因素:
您的系统与上述最弱的系统一样强大。
答案 3 :(得分:0)
以下问题来自姐妹网站Security StackExchange。他们讨论散列,盐,PBKDF2,bcrypt,scrypt等一些事情。
此处还有一些关于StackOverflow的讨论:
Is BCrypt a good hashing algorithm to use in C#? Where can I find it?
简而言之,对于一个问题,盐是一种安全措施,使得在发生危害时恢复密码需要很长时间,就像哈希一样。如果攻击一个密码,盐就不会有所作为。如果尝试使用预先计算的字典或同时测试多个密码,每个条目使用不同的盐将大大增加所需的工作量,并且通常会使生成合适的彩虹表不可行。
答案 4 :(得分:-1)
这是一篇关于密码学的好文章:http://www.javacodegeeks.com/2012/02/introduction-to-strong-cryptography-p1.html
有关盐的讨论,请参阅哈希算法的实际使用情况,方案1 一节。
我强烈建议您使用http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html生成盐