【发布时间】:2011-07-12 07:06:57
【问题描述】:
我正在阅读this tutorial,我遇到了以下关于加密的讨论。最后写着
在最后一行,我们用密码对盐进行了哈希处理,得到了一个 实际上是加密的密码 无法破解
但在我看来,同时拥有encrypted_password 和salt 的黑客可以像使用salt 一样执行“彩虹”技巧。
那么,我哪里错了?
谢谢!
$ 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 中 library.7 知道并不重要 这些哈希函数究竟是如何工作的; 为了我们的目的,重要的是 他们是单向的:没有 计算上易于处理的方法 发现
2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b 是字符串的 SHA2 哈希 “秘密”。
但是,如果您考虑一下,我们 还有一个问题:如果攻击者 曾经掌握过散列密码, 他还有机会 发现原件。为了 例如,他可以猜到我们使用了 SHA2,所以写一个程序 将给定的哈希值与哈希值进行比较 潜在密码的值:
>> hash = "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b" >> secure_hash("secede") == hash => false >> secure_hash("second") == hash => false >> secure_hash("secret") == hash => true所以我们的攻击者有一个匹配 - 坏消息 对于任何具有密码“秘密”的用户。 这种技术被称为彩虹 攻击。
为了阻止潜在的彩虹攻击,我们 可以使用盐,这是一种不同的 每个用户的唯一字符串。8 一个 (几乎)确保的常用方法 唯一性是散列当前时间 (在 UTC 中与时区无关) 连同密码,这样两个 只有在以下情况下,用户才会有相同的盐 它们的创建方式完全相同 时间和密码相同。让我们 看看这是如何使用的 中定义的secure_hash函数 上面的控制台:
>> 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"在最后一行,我们用密码对盐进行了哈希处理,得到了一个 实际上是加密的密码 不可能破解。 (为清楚起见, 散列函数的参数是 通常用--分隔。)
【问题讨论】:
-
关于 SO 的许多其他问题的副本。
标签: encryption