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

kg7wmglp  于 2022-12-26  发布在  Node.js
关注(0)|答案(4)|浏览(121)

我使用brypt-nodejs来生成散列,但有时它会在生成的字符串中添加斜线,如下面所示,这给我在尝试通过URL发送它时带来了困难。

$12$G/KJOwTBLjGwcnAGaTlJMnAnkXa6/M1jt8FppD

bcrypt中是否有一个设置可以生成不带斜杠的散列,或者我应该手动删除它们,或者用一些不太可能的模式(例如slashslash)替换,以便能够恢复它的出现,如果它出现的话?

$12$GslashslashKJOwTBLjGwcnAGaTlJMnAnkXa6slashslashM1jt8FppD

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

qv7cva1a

qv7cva1a1#

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

下面是您在收到哈希值后的处理方式:

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

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

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

vs3odd8k2#

TLDR;你不能。
bcrypt跟在modular crypt format后面。将其更改为使用斜杠以外的内容将使哈希与其他实现不兼容。bcrypt哈希是base64编码,* 在其字符集 * 中包含/。
或者,您可以对生成的散列进行手动转换,或者使用base_64编码构建自己的实现,用其他内容替换/。

myss37ts

myss37ts3#

虽然@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
}

注:多次重新运行哈希不会改变算法。即使哈希后的密码总是不同的,但它总是与普通密码相同。

disbfnqx

disbfnqx4#

/+符号替换为&或任何其他未使用的url安全符号

bcrypt = "$2a$04$Xdbla3daq84.TJZ2deXSBOZ3humTScPlgkMZoUH6gNC0NoZiqblVa";
urlsafe = str_replace(bcrypt, {"/", ";"}, {"+", "*"});

相关问题