【问题标题】:Laravel & Meteor password hashingLaravel 和 Meteor 密码哈希
【发布时间】:2016-02-05 16:11:29
【问题描述】:

我有两个应用程序,一个在 Laravel 5.2 中,一个在 Meteor 中。我想收集与两个平台兼容的密码的哈希值。

数据库单独存储哈希

  • password Laravel。
  • meteor_password 代表 Meteor。

默认情况下,两个平台都使用 10 轮的 bcrypt,但 Meteor 似乎在 bcrypt 之前 sha256 明文密码。

如果 Meteor 创建密码哈希 abc,我可以 sha256 明文密码,并使用 Laravel 的内部结构将其与 abc 进行比较,即 Auth::attempt()

$sha256 = hash('sha256', $request->get('password'), false);

这行得通。 Laravel 成功验证了用户。

但是,如果我在 Laravel 中注册了一个新用户,并存储了哈希 meteor_password,当在 Meteor 中针对该哈希进行身份验证时,它会失败并显示错误消息“禁止登录”。 This error appears to be mean incorrect credentials.

我创建哈希的方式与我在 Laravel 中验证时的方式相同。

$meteor_password = bcrypt(hash('sha256', $plain, false));

它以一种方式而不是另一种方式工作似乎很奇怪,所以我认为我错过了一些东西。

【问题讨论】:

    标签: laravel meteor hash bcrypt


    【解决方案1】:

    在 2011 年,在 PHP 的 BCrypt 实现中发现了一个 bug,所以他们将原来的 2a 版本指示符 changed 改为今天使用的 2x2y,表示密码被固定版本。

    因此,PHP 的2y 生成的哈希值应该与节点的2a 生成的哈希值相同。

    应该更改前缀以便 NPM 模块(由 Meteor 使用)正确处理,因为它是 does not acknowledge 2y

    $meteor_password = bcrypt(hash('sha256', $plain, false));
    // replace it useing something like:
    $meteor_password = str_replace('$2y', '$2a', $meteor_password);
    // or
    $meteor_password[2] = 'a';
    

    【讨论】:

    • 准确,按预期工作。感谢您的链接;有趣的读物。
    • 太棒了。顺便说一句,“成本”因子是指数级的,所以 10 的成本实际上是 (2^10=)1024 轮,而不是 10 :)
    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2013-04-06
    • 2015-04-05
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多