Laravel & Meteor 密码散列

Laravel & Meteor password hashing

我有两个应用程序,一个在 Laravel 5.2 中,一个在 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 中根据该散列进行身份验证时,它会失败并显示错误消息 "Login Forbidden"。

我创建散列的方式与我在 Laravel 中验证它时的方式相同。

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

它以一种方式工作而不是另一种方式似乎很奇怪所以我想我错过了什么。

2011 年,在 PHP 的 BCrypt 实现中发现了一个错误,因此他们 changed 将原始的 2a 版本指示符 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('y', 'a', $meteor_password);
// or
$meteor_password[2] = 'a';