如何避免bcrypt-node在URL字符串哈希中添加斜杠?

时间:2019-01-19 17:51:06

标签: node.js encryption bcrypt

我正在使用brypt-nodejs来生成哈希,但是有时它会在生成的字符串中添加斜杠,例如下面的斜杠,这在我尝试通过URL发送时给我带来了困难。

$12$G/KJOwTBLjGwcnAGaTlJMnAnkXa6/M1jt8FppD

bcrypt中是否有一个设置会生成没有斜杠的哈希值,还是我应该手动删除它们或使用一些不太可能的模式(例如slashslash)替换它,以便能够恢复它的出现? / p>

$12$GslashslashKJOwTBLjGwcnAGaTlJMnAnkXa6slashslashM1jt8FppD

谢谢你让我知道你的想法!

3 个答案:

答案 0 :(得分:1)

您可以将/替换为另一个字符串,例如“斜杠”

这是您收到哈希后如何处理它的方法:

 hash.replace(/\//g, "slash");

要进行比较,您必须将“斜杠”转换回/

.compare(user.id, req.params.secretToken.replace(/slash/g, "/"))

答案 1 :(得分:0)

TLDR;你不能。

bcrypt跟在modular crypt format之后。将其更改为使用除斜杠之外的其他内容将使哈希与其他实现不兼容。 bcrypt散列是base64编码的,在其字符集中包含/

或者,您可以对生成的哈希进行手动转换,也可以使用base_64编码(用/替换其他东西)构建自己的实现。

答案 2 :(得分:0)

虽然@AdrianJohn提出了在哈希密码中替换斜杠字符的方法,但这似乎是解决方法。但是,这不是一个有效的解决方案。因为,当您替换该正斜杠时,使用bcrypt.compare方法将其与普通密码进行比较时,密码肯定会有所不同。

这是方法:您必须重新运行bcrypt.hash方法,直到库将为您提供URL安全密码(不带斜杠)为止。

我正在寻找解决方案……没有答案。看我自己做了什么,它就像迪斯科一样!

handlePasswordHashing = (plainPassword, salt) => {
    let hashed = bcrypt.hashSync(plainPassword, salt)

    if (hashed.includes("/")) {
       hashed = this.handlePasswordHashing(plainPassword, salt)
    }

    return hashed
}

注意:多次重新运行哈希不会更改算法。即使密码一旦经过散列后总是不同的,但它始终与普通密码相同。