在散列数据库存储密码时,我总是使用正确的每个条目的盐字符串.根据我的需要,将盐存储在哈希密码旁边的数据库中一直运行正常.
但是,有些人建议将盐与数据库分开存储.他们的论点是,如果数据库受到攻击,攻击者仍然可以构建一个彩虹表,将一个特定的盐字符串考虑在内,以便一次破解一个帐户.如果此帐户具有管理员权限,那么他甚至可能不需要破解任何其他帐户.
从安全角度来看,将盐储存在不同的地方是否值得?考虑在同一台机器上具有服务器代码和DB的Web应用程序.如果盐存储在该机器上的平面文件中,则很可能如果数据库受到损害,则salt文件也是如此.
有什么建议的解决方案吗?
我正在阅读本教程,我遇到了以下关于加密的讨论.最后写了
在最后一行中,我们使用密码对盐进行了哈希处理,产生了一个几乎无法破解的加密密码
但在我看来,一个拥有encrypted_password和salt可以做"彩虹"技巧的黑客就像我们使用的那样salt.
那么,我哪里错了?
谢谢!
Run Code Online (Sandbox Code Playgroud)$ rails console >> require 'digest' >> def secure_hash(string) >> Digest::SHA2.hexdigest(string) >> end => nil >> password = "secret" => "secret" >> encrypted_password = secure_hash(password) => "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b" >> submitted_password = "secret" => "secret" >> encrypted_password == secure_hash(submitted_password) => true这里我们定义了一个名为secure_hash的函数,它使用一个名为SHA2的加密哈希函数,它是SHA系列哈希函数的一部分,我们通过摘要库将它们包含在Ruby中.7确切地知道这些哈希函数是如何工作的并不重要.为了我们的目的,重要的是它们是单向的:没有计算上易于理解的方法来发现它
2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b是字符串"secret"的SHA2哈希值.
但是,如果你考虑一下,我们仍然有一个问题:如果攻击者掌握了哈希密码,他仍然有机会发现原件.例如,他猜测我们使用了SHA2,因此编写一个程序来将给定的哈希与潜在密码的哈希值进行比较:
Run Code Online (Sandbox Code Playgroud)>> hash = "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b" >> secure_hash("secede") == hash => false >> secure_hash("second") == hash => false >> secure_hash("secret") == hash => true所以我们的攻击者对任何密码为"secret"的用户都有一个匹配 - 坏消息.这种技术被称为彩虹攻击. …