Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中的$2y bcrypt哈希_Javascript_Node.js_Cryptography_Bcrypt - Fatal编程技术网

Javascript Node.js中的$2y bcrypt哈希

Javascript Node.js中的$2y bcrypt哈希,javascript,node.js,cryptography,bcrypt,Javascript,Node.js,Cryptography,Bcrypt,我正在处理一个带有$2y散列的旧数据库。我对此进行了深入研究,还偶然发现了$2a和$2y之间的区别 我查看了节点模块,它似乎只生成和比较$2a散列 我发现一个网站可以生成$2y哈希,这样我就可以用bcrypt测试它们 var twinBcrypt = require('twin-bcrypt') var bcrypt = require('bcrypt') var string = 'helloworld' var bcryptAttempt = bcrypt.compareSyn

我正在处理一个带有
$2y
散列的旧数据库。我对此进行了深入研究,还偶然发现了
$2a
$2y
之间的区别

我查看了节点模块,它似乎只生成和比较
$2a
散列

我发现一个网站可以生成
$2y
哈希,这样我就可以用
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)
下面是字符串
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 ]
如何在节点中比较
$2y
散列,这让我感到困惑

上面说你可以把
$2y
改成
$2a
,但我还是不行

更新

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

reggi helloworld
输出对应于这里:

reggi:$2y$10$iuC7GYH/h1Gl1aDmcpLFpeJXN9OZXZUYnaqD2NnGLQiVGQYBDtbtO
在我把它当作

helloword
我假设散列为一个空字符串

通过这些更改,将
y
更改为
a
将在
bcrypt
中工作。而且双bcrypt也能正常工作。

  • 使用
    bcrypt
    时,将
    y
    更改为
    a
  • 当使用
    twin-bcrypt
    时,哈希就可以工作了
使用时,请确保提供用户名和密码

reggi helloworld
然后:

下面是一个使用
bcrypt
twin-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中使用
bcrypt
生成的
2a$
散列,将
2a
替换为
2y
,然后在其他语言中使用
2y
库进行比较(php本机和.net中的
BCrypt
都可以处理它,这让我觉得很奇怪)。如果这对你有帮助的话,我可以挖掘我的测试代码。@dvlsg得到了。这是有意义的。所以我需要比较node中的
$2y
散列,而不是php中的
$2a
散列,我猜这是通过将
a
替换为
y
来实现的。是的,我实际上是使用PHP和.NET都是这样,但当我在node中使用它们时,我有一个额外的转换步骤,在比较之前将
y
切换回
a
。这感觉是错误的,但看起来好像
2a
2y
对salt/hash的其余部分使用了相同的结构。你是说false,true?2年后,这仍然是一个终生的sav呃!