使用 bcrypt 生成的 Rails 密码是否可移植?

2024-02-09

我有一个现有的 Web 应用程序,有几千个用户,我正在将其移植到 Rails。当我重写和重构此应用程序时,我可能需要在任意数量的不同服务器上运行它以用于开发、测试和生产目的。

我在我的用户模型中使用 Rails 的内置 has_secure_password 方法,但我担心密码数据的可移植性。我需要将数据库的内容从一台机器移动到另一台机器,以便在不同的环境中进行测试,这一点非常重要,我可以在每个环境中使用相同的用户和密码集来测试用户身份验证功能。

到目前为止,很容易找到有关 bcrypt-ruby 如何与 Rails 一起工作的答案has_secure_password但经过几周的搜索我还没有找到明确的答案。

If has_secure_password结果是 WorkFactor + Salt + HashedPassword 连接并保存到password_digest那么数据库列如果移动到任何其他机器(假设任何其他机器在类 Unix 操作系统上运行 Rails),该哈希是否可以重新生成并可靠地进行比较?

OR换句话说 - bcrypt-ruby 密码是用 Rails 生成的has_secure_password便携的?

跟进问题:如果盐总是随机生成的(我见过相同的密码使用不同的哈希值,所以我不认为盐是从密码本身的文本创建的)那么Rails应用程序如何能够可靠地重新哈希密码在登录表单上提交并将其与数据库中的内容进行比较。显然,它必须首先知道盐是什么才能进行比较。它是怎么做到的?


是的,密码是可移植的。使用的格式是标准“加密编码”格式,也用作 RFC 2307 的一部分(在 RFC 2307 中,字符串将带有前缀“{CRYPT}”)。我曾使用过 Perl 库Authen::Passphrase这将很高兴地根据 RoR 数据库中的 bcrypt 哈希版本来验证密码。

对于后续问题:salt 嵌入到存储的值中(以及哈希类型、要使用的 bcrypt 周期数,当然还有哈希本身),并且为了验证服务器需要读取存储的值,然后它只需重新使用相同的盐来生成哈希部分 - 如果输入密码正确,则哈希将是相同的。身份验证过程不会创建新的随机盐。仅在生成用于存储的全新哈希值时才会创建随机盐。

bcrypt 密码可以轻松地拆分为多个组件以供服务器读取(我选择了非现实字符以便更容易看到边界,事实上 salt 和 hash 是 Base 64 编码的二进制数据):

 $2a$10$AaBbCcDdEeFfGgHhIiJjKk0987654321098765432109876543210
  • 这部分的意思是“使用 bcrypt,2**10 == 1024 次迭代”:$2a$10$

  • 这部分是盐:AaBbCcDdEeFfGgHhIiJjKk,始终为 22 个字符

  • 这部分是哈希:0987654321098765432109876543210,始终为 31 个字符

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 bcrypt 生成的 Rails 密码是否可移植? 的相关文章

随机推荐