ruby-on-rails - 尝试理解 Ruby on Rails 中的加盐和散列密码

标签 ruby-on-rails encryption saltedhash

我正在浏览 Michael Hartl 的书(很棒的免费资源,顺便说一句,感谢 Michael!)我有一个关于加盐和散列密码的问题。加盐密码的目的是防止黑客进行彩虹攻击,如果我理解正确的话,如果黑客可以猜测使用的加密类型,这基本上是一种蛮力攻击。为了防止这种攻击,在加密之前使用盐来随机化密码,但是盐必须与加密密码一起存储?如果是这样,那么如果黑客可以访问数据库并检索加密的密码,那么他们不能也检索盐并继续进行彩虹攻击吗?

这是迈克尔的过程代码示例......

>> 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"

非常感谢!

最佳答案

不,彩虹攻击与蛮力攻击不同。

您可以将彩虹表视为一个包含字符串及其散列的大型数据库。当有人访问您的数据库时,他们可以将密码哈希与彩虹表中的密码进行比较并轻松获取密码。

盐通过在密码中添加额外的位来防止这种情况。如果盐足够长,则哈希不会在彩虹表中。

使用蛮力攻击时,您必须计算哈希值,而使用彩虹攻击时,您已经有了哈希值。

所以是的,当有人访问您的数据库时,他们也可以获得您的盐。但是,如果每条记录是唯一的,那并不重要。

关于ruby-on-rails - 尝试理解 Ruby on Rails 中的加盐和散列密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213880/

相关文章:

ruby-on-rails - rails 4 中有序的 has_many 关联

mysql - 从 heroku 提取数据库失败并出现 Encoding::CompatibilityError

ruby-on-rails - 读取 RoR 中的参数数组

php - 在 PHP 中重定向时如何在 URL 中传递 'encrypt' 信息?

c# - System.Security.Cryptography 与 Windows.Security.Cryptography

ios - SQLite3 中加密/解密字段出现问题

validation - magento 中的哈希密码功能是否已更改?如果是这样,为了什么?

node.js - bcrypt node.js(自动生成盐和哈希值)

mysql - 无法让 mysql gem 在 Snow Leopard 中工作,无法在 rails 环境中设置 ruby