节点和流星服务器之间的bcrypt无效比较

时间:2018-03-28 13:27:10

标签: javascript node.js meteor bcrypt

现在我们正在尝试将用户密码哈希从基本node.js v0.10.48应用程序迁移到Meteor服务器。我希望通过使用相同版本的bcrypt来进行密码散列可能会自己迁移哈希值,但到目前为止,这种比较并不起作用。

我确保两者都使用相同版本的bcrypt,并且每个版本都可以单独使用它们来比较它们自己创建的哈希值。但我无法将服务器A上创建的哈希与使用相同密码在服务器B上创建的哈希进行比较。

有没有办法完成我正在寻找的东西?

编辑:添加一些例子。首先是在流星方面运行:

此处的哈希密码已经是SHA256哈希(并且该部分在两台服务器之间排列得很好)。

> bcrypt.hashSync(SHA256 HASHED VALUE, 10)
'$2a$10$ky0cB/ezKnyLojOEVfkS9O9jn0V5Lo3BNMLIU2jTokHDcQDk33A0y'
> bcrypt.hashSync(SHA256 HASHED VALUE, 10)
'$2a$10$FdoTohtW/Djd1CN9MJJk6OmD7z60sBUaz56ez62.V/XH7r5s5yBtu'
> bcrypt.compareSync(SHA256 HASHED VALUE, '$2a$10$ky0cB/ezKnyLojOEVfkS9O9jn0V5Lo3BNMLIU2jTokHDcQDk33A0y')
true
> bcrypt.compareSync(SHA256 HASHED VALUE, '$2a$10$FdoTohtW/Djd1CN9MJJk6OmD7z60sBUaz56ez62.V/XH7r5s5yBtu')
true

在节点应用程序端,使用该密码我得到相同的SHA256哈希,但是在使用相同的盐运行bcrypt之后(故意只使用相同的值进行测试)我得到了

$ 2A $ 10 $ ONspBE0StIMRH0GJOI3zO.uFey4yk7dFS85EycN.lnklr4QZk9T0a

使用相同的SHA256哈希运行上述类似的测试会得到错误的结果。

2 个答案:

答案 0 :(得分:0)

有一些事情要检查BCrypt。

  1. 正在执行多轮哈希,
  2. 正在使用哪个版本的算法。
  3. 这些都应该易于检查,因为它们应该在存储的哈希的开头进行编码。

    散列密码Password可能类似于

    $2a$04$b.ATnW5JRfDNyKnKJ8SBO.QwtkLANvAc751Qn.N/wcxZmA/CIDFNK

    $2a$04$显示散列版本和轮次数。

    有关算法版本的详细信息,请参阅Wikipedia BCrypt Versioning History

    如果版本相同,那么散列的散列可能不同,两者都应该是可配置的。

答案 1 :(得分:0)

这意味着什么,迁移哈希?

观察meteor哈希用户输入客户端的密码:

https://github.com/meteor/meteor/blob/1dbc3304c715ae5bc66efd8e02c7e1e2b86540a2/packages/accounts-password/password_client.js#L77

这是你期望的吗?

原始用户密码在被送入bcrypt之前是否已经哈希?如果没有,您需要修改accounts-password以直接使用密码登录,而不是客户端哈希密码。您可以更改上面的代码来执行此操作。

如果在进入bcrypt之前进行了哈希处理,请注意Meteor有自己的SHA256包,与crypt相比,输出可能略有不同:

https://github.com/meteor/meteor/blob/devel/packages/sha/sha256.js

不要把盐弄得一团糟。这不是问题。