javascript - Node.js 中的 $2y bcrypt 哈希

标签 javascript node.js cryptography bcrypt

我正在处理一个带有 $2y 哈希值的旧数据库。我对此进行了深入研究,也偶然发现了 the stack overflow $2a$2y 的区别。

我查看了 bcrypt 的 Node 模块它似乎只生成和比较 $2a 哈希值。

我找到了一个生成 $2y 哈希值的网站,因此我可以使用 bcrypt 对其进行测试。

这是字符串 helloworld$2y 哈希示例。

helloworld:$2y$10$tRM7x9gGKhcAmpeqKEdhj.qRWCr4qoV1FU9se0Crx2hkMVNL2ktEW

似乎该模块无法验证 $2y 哈希值。

这是我的测试。

var Promise = require('bluebird')
var bcrypt = require('bcrypt')

var string = 'helloworld'

Promise.promisifyAll(bcrypt)

// bcrypt.genSalt(10, function(err, salt) {
//   bcrypt.hash(string, salt, function(err, hash) {
//     console.log(hash)
//   })
// })

var hashesGeneratedUsingBcryptModule = [
  '$2a$10$6ppmIdlNEPwxWJskPaQ7l.d2fblh.GO6JomzrcpiD/hxGPOXA3Bsq',
  '$2a$10$YmpoYCDHzdAPMbd9B8l48.hkSnylnAPbOym367FKIEPa0ixY.o4b.',
  '$2a$10$Xfy3OPurrZEmbmmO0x1wGuFMdRTlmOgEMS0geg4wTj1vKcvXXjk06',
  '$2a$10$mYgwmdPZjiEncp7Yh5UB1uyPkoyavxrYcOIzzY4mzSniGpI9RbhL.',
  '$2a$10$dkBVTe2A2DAn24PUq1GZYe7AqL8WQqwOi8ZWBJAauOg60sk44DkOC'
]

var hashesGeneratedUsingAspirineDotOrg = [
  '$2y$10$MKgpAXLJkwx5tpijWX99Qek2gf/irwvp5iSfxuFoDswIjMIbj2.Ma',
  '$2y$10$tRM7x9gGKhcAmpeqKEdhj.qRWCr4qoV1FU9se0Crx2hkMVNL2ktEW'
]

var hashesGeneratedUsingAspirineDotOrgSwippedYForA = [
  '$2a$10$MKgpAXLJkwx5tpijWX99Qek2gf/irwvp5iSfxuFoDswIjMIbj2.Ma',
  '$2a$10$tRM7x9gGKhcAmpeqKEdhj.qRWCr4qoV1FU9se0Crx2hkMVNL2ktEW'
]

hashesGeneratedUsingBcryptModule = hashesGeneratedUsingBcryptModule.map(hash => bcrypt.compareAsync(string, hash))
hashesGeneratedUsingAspirineDotOrg = hashesGeneratedUsingAspirineDotOrg.map(hash => bcrypt.compareAsync(string, hash))
hashesGeneratedUsingAspirineDotOrgSwippedYForA = hashesGeneratedUsingAspirineDotOrgSwippedYForA.map(hash => bcrypt.compareAsync(string, hash))

Promise.all(hashesGeneratedUsingBcryptModule)
.tap(() => console.log('hashesGeneratedUsingBcryptModule'))
.then(console.log)

Promise.all(hashesGeneratedUsingAspirineDotOrg)
.tap(() => console.log('hashesGeneratedUsingAspirineDotOrg'))
.then(console.log)

Promise.all(hashesGeneratedUsingAspirineDotOrgSwippedYForA)
.tap(() => console.log('hashesGeneratedUsingAspirineDotOrgSwippedYForA'))
.then(console.log)

结果如下:

// hashesGeneratedUsingAspirineDotOrg
// [ false, false ]
// hashesGeneratedUsingBcryptModule
// [ true, true, true, true, true ]
// hashesGeneratedUsingAspirineDotOrgSwippedYForA
// [ false, false ]

我对如何比较 Node 中的 $2y 哈希感到困惑。

another Stack Overflow question / answer这表示您可以将 $2y 更改为 $2a 但对我来说仍然失败。

更新!

我正在使用 the generator不正确,因为它是一个 .htpasswd 密码生成器,您必须以这种格式输入用户名和密码。

reggi helloworld

输出对应于此:

reggi:$2y$10$iuC7GYH/h1Gl1aDmcpLFpeJXN9OZXZUYnaqD2NnGLQiVGQYBDtbtO

之前我只是把

helloword

我假设这是一个空字符串。

通过这些更改,将 y 更改为 a 可以在 bcrypt 中使用。 twin-bcrypt 就可以了。

最佳答案

  • 使用 bcrypt 时,将 y 更改为 a
  • 当使用 twin-bcrypt 时,散列就可以了。

使用 http://aspirine.org/htpasswd_en.html 时确保提供用户名和密码。

reggi helloworld

然后:

reggi:$2y$10$Am0Nf/B6.S/Wkpr6IVdIZeuHWNa/fqoLyTNmlyrSg22AjRf2vS.T.

这是一个同时使用 bcrypttwin-bcrypt 的工作示例。

var twinBcrypt = require('twin-bcrypt')
var bcrypt = require('bcrypt')

var string = 'helloworld'

var bcryptAttempt = bcrypt.compareSync(string, "$2y$10$Am0Nf/B6.S/Wkpr6IVdIZeuHWNa/fqoLyTNmlyrSg22AjRf2vS.T.".replace(/^\$2y/, "$2a"))
console.log(bcryptAttempt)

var twinBcryptAttempt = twinBcrypt.compareSync(string, "$2y$10$Am0Nf/B6.S/Wkpr6IVdIZeuHWNa/fqoLyTNmlyrSg22AjRf2vS.T.")
console.log(twinBcryptAttempt)

输出:

true
true

关于javascript - Node.js 中的 $2y bcrypt 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36041533/

相关文章:

javascript - 二叉树的最小深度不适用于所有测试用例

javascript - 在 setinterval 中使用长间隔时,Node.js 崩溃

javascript - 使用 es6 在 NodeJs 中导入 JSON 文件

java - 获取 key 流 - Java 解密

Java 的 'Keystore' 的 Python 等价物?

java相当于php的hmac-SHA1

javascript - 在钛手机中打开没有模式属性的新窗口时如何显示标题/导航栏?

javascript - 错误: uncaughtException: primordials is not defined

javascript - 附加子Javascript

javascript - 获取最后的返回值