我正在阅读本教程,我遇到了以下关于加密的讨论.最后写了
在最后一行中,我们使用密码对盐进行了哈希处理,产生了一个几乎无法破解的加密密码
但在我看来,一个拥有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"的用户都有一个匹配 - 坏消息.这种技术被称为彩虹攻击.
为了阻止潜在的彩虹攻击,我们可以使用salt,这是每个用户不同的唯一字符串.8(几乎)确保唯一性的一种常用方法是将当前时间(以UTC为独立时区)散列使用密码,这样两个用户只有在完全相同的时间创建并拥有相同的密码才能拥有相同的salt.让我们看一下如何使用上面控制台中定义的secure_hash函数:
Run Code Online (Sandbox Code Playgroud)>> Time.now.utc => Fri Jan 29 18:11:27 UTC 2010 >> password = "secret" => "secret" >> salt = secure_hash("#{Time.now.utc}--#{password}") => "d1a3eb8c9aab32ec19cfda810d2ab351873b5dca4e16e7f57b3c1932113314c8" >> encrypted_password = secure_hash("#{salt}--#{password}") => "69a98a49b7fd103058639be84fb88c19c998c8ad3639cfc5deb458018561c847"在最后一行中,我们使用密码对盐进行了哈希处理,产生了一个几乎无法破解的加密密码.(为清楚起见,散列函数的参数通常用 - 分隔.)
Mar*_*tos 32
彩虹表的计算成本很高.如果没有盐,您可以构建一个可以重复使用的彩虹表,因为密码"password"将始终产生相同的散列(md5 = 5f4dcc3b5aa765d61d8327deb882cf99,sha1 = 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8),因此很容易在密码数据库中识别.
使用盐,您必须为遇到的每种盐计算彩虹表.一个大小合适的盐,比如32位(理想情况下,128甚至更多),意味着您必须为要破解的每个密码计算一个彩虹表,从而在很大程度上击败其目的.
Salt旨在阻止某人预先计算"反向"查找表,该表允许攻击者快速找到导致目标哈希的密码.创建这些表中的一个是计算上的工作,与强制目标密码空间一样多,所以只有在许多目标上使用该表才有意义.
盐防止这种情况; 攻击者在生成表时需要考虑盐,因此该表只适用于单个目标,攻击者可以恢复暴力.