我有一个使用设计处理身份验证的 rails 3 生产应用程序。我想更改为在应用程序上使用 bcrypt 而不是 sha,但我找不到任何资源来解释从一个迁移到另一个的过程。我假设您需要采取某种回退措施来处理目前密码以某种方式用 sha 加盐的事实......
以前有人做过吗?!任何提示、教程、演练等?!
我有一个使用设计处理身份验证的 rails 3 生产应用程序。我想更改为在应用程序上使用 bcrypt 而不是 sha,但我找不到任何资源来解释从一个迁移到另一个的过程。我假设您需要采取某种回退措施来处理目前密码以某种方式用 sha 加盐的事实......
以前有人做过吗?!任何提示、教程、演练等?!
我认为没有您想要的解决方案。我只知道两种选择——
重置所有用户密码并通过电子邮件告诉他们这已经完成(最好是为什么他们不会吓坏)
当每个用户登录时,检查您拥有的旧哈希系统,如果它验证,在新列中创建一个新的 bcrypt 哈希,然后删除旧的、不太安全的哈希,并以这种方式开始缓慢的迁移。
创建彩虹表以移动到每个人所需的数学能力是不可能的。
这是一个更好的算法,可以让你一次切换所有人。您必须弄清楚如何在设计中实现这一点,但这是大纲。这不是我的,可以在网络上注明的 URL 找到。
http://blog.jgc.org/2012/06/one-way-to-fix-your-rubbish-password.html
假设您有一个数据库,其中包含站点的 n 个用户的密码散列,并且对于每个用户,您都有 salt si 和 hash hi(其中 hi 是使用某种算法计算的,例如 SHA1 或 MD5)。(请注意,如果没有盐,这些说明的其余部分都有效,请忽略它)。
假设您选择使用 scrypt。对于每个用户,您首先创建一个新的随机盐值 s'i,然后使用公式 scrypt(s'i, hi) 计算一个新的哈希值 h'i,并将新的盐值和哈希值存储在数据库中。你扔掉旧的弱哈希,忘记它曾经存在过。所以你留下了两个盐值和一个新的哈希值。(我忽略了留给读者确定的其他 scrypt 参数)。
当用户 i 登录并提供密码 p 时,您使用旧的弱哈希算法(假设它是 md5(salt, password))来计算哈希以进行比较,如下所示: scrypt(s'i, md5(si, p))并将其与存储在数据库中的 h'i 进行比较。
如果像 last.fm 一样,您还允许第三方通过提供旧的哈希值而不是密码来授权用户,那么您仍然可以使用此方案。当第三方为用户 i 提供哈希 h 时,您计算 scrypt(s'i, h) 并进行比较。
如果不需要第 4 步,那么您可以在用户登录时更进一步。一旦用户使用密码 p 成功登录,您可以通过选择新的随机盐值 s''i 和计算 scrypt(s''i, p) 并将其存储在数据库中。
This has the effect of immediately making your password database more secure if stolen without any effort on the part of your users.
用户模型:
设计:可加密
设计用户迁移文件:
t.可加密的
您可以使用这些设置吗?