【问题标题】:BCrypt error Illegal arguments: string, objectBCrypt错误非法参数:字符串,对象
【发布时间】:2020-08-13 17:26:16
【问题描述】:

我正在开发一个基于 NodeJS 和 ReactJS 的 Web 应用程序,我在其中尝试在多个路由中对密码进行哈希处理,一个用于注册,另一个用于更改密码。

为此,我在两条路线之外生成盐,因此它们都使用相同的盐,如下所示:

const salt = bcrypt.genSalt(10);

现在在路由内部,has 是这样生成的:

user.password = await bcrypt.hash(newPassword, salt);

但是当我运行它时,它会给出以下控制台错误:

非法参数:字符串、对象

当我在各个路由中生成盐时,哈希操作运行良好。可能是什么原因?

【问题讨论】:

    标签: node.js authentication bcrypt


    【解决方案1】:

    我猜你会这样打电话给bcrypt.hash

    await bcrypt.hash(newPassword, 10);

    这意味着您传递的是轮数,而不是盐。如果你想在通话之外生成盐,你可以这样做

    const salt = bcrypt.genSaltSync(10);

    然后在bcrypt.hash中使用。

    【讨论】:

    • 不,我实际上是这样做的:await bcrypt.hash(newPassword, salt);
    • 好的。然后也许有一个变量的阴影。尝试在此处将名称从 salt 更改为 saltrandomstring 之类的名称,看看是否可行。
    • 实际上const salt = bcrypt.genSaltSync(10); 确实为我工作。谢谢。
    • 很高兴它帮助了你
    • 但是,有一个问题,因为我在路由之外生成了盐,所以每次都会生成一个新的盐。因此,我无法将旧密码与新密码进行比较。有什么办法可以让两条路线都使用相同的盐吗?或者如果我可以将它们与盐进行比较。
    【解决方案2】:

    以防其他人遇到这种情况。

    不要忘记像这样等待 genSalt 函数:

    const salt = await bcrypt.genSalt(10);
    

    错误:Illegal arguments: string, object 试图解释传递给哈希函数的参数之一无效,因为它的类型无效。

    在这种情况下,它是第二个参数 (salt),它需要一个字符串/数字,但接收一个对象 (如果你不await,则返回的承诺对象) em>。

    希望对你有所帮助?

    【讨论】:

      【解决方案3】:

      查看文档,我认为该错误是由您的 genSalt() 中缺少的回调函数引起的。genSaltSync() 在没有回调的情况下运行良好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-17
        • 2021-07-21
        • 1970-01-01
        • 2021-04-20
        • 2018-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多