2016-02-05 65 views
5

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

数据库分别

  • password存储散列为Laravel。
  • meteor_password流星。

这两个平台默认都使用bcrypt,默认10轮,但流星似乎在bcrypt之前使用纯密码。

如果流星创建密码哈希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)); 

这似乎很奇怪,它会工作的一种方式,而不是其他所以我认为我失去了一些东西。

回答

3

在2011年,一个bug是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('$2y', '$2a', $meteor_password); 
// or 
$meteor_password[2] = 'a'; 
+0

现货,按预期工作。感谢您的链接;有趣的读物。 –

+0

太好了。顺便说一句,“成本”因素是指数,所以10的成本实际上是(2^10 =)1024轮,而不是10 – MasterAM