mongoose 对于相同的字符串,bcrypt comparesync始终返回false

qfe3c7zg  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(256)

即使字符串完全相同,Bcrypt比较和compareSync也总是返回false?我用console.log来验证它们是相同的,并且它们没有被散列两次等等。这是一个奇怪的问题。我已经在其他类似的问题上尝试过解决方案。
model.js

import mongoose from "mongoose";
import bcrypt from "bcryptjs";

const ResetTokenSchema = new mongoose.Schema({
    owner: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Doctor",
        required: true,
    },

    token: {
        type: String,
        required: true,
    },

    createdAt: {
        type: Date,
        expires: 3600, //expires after an hour
        default: Date.now(),
    },
});

// HASH token before storing
ResetTokenSchema.pre("save", async function (next) {
    if (this.isModified("token")) {
        const encryptedToken = await bcrypt.hash(this.token, 8);
        this.token = encryptedToken;
        console.log("the token is" + this.token)
    }
    next();
});

ResetTokenSchema.methods.compareToken = async function (encryptedToken) {
    const result = await bcrypt.compare(encryptedToken, this.token);
    console.log(this.token)
    console.log(encryptedToken)
    console.log(result)
    return result;
};

export default mongoose.model("ResetToken", ResetTokenSchema);

控制台输出:

jaxagkaj

jaxagkaj1#

问题:

下面是来自bycryptjs源代码的.compare()函数的作用:

  • 将给定数据与给定哈希进行异步比较。
  • @param {string} s要比较的数据
  • @param {string} hash要比较的数据

下面是该函数的正确用法示例

const hash = await bcrypt.hash("foo", 8);
  const res = await bcrypt.compare("foo", hash)
  console.log(res) // true

代码所做的是将字符串与其自身进行比较,而不是将字符串与其哈希值进行比较。.compare(a,b)a===b * 不 * 相同。

可能的解决方案:

在您的代码中,可以使用.pre()函数中的以下代码行将原始令牌重新分配给新的哈希令牌:

this.token = encryptedToken;

如果删除此行,代码将正常工作。
或者,如果你真的想重新分配,那么你必须改变你正在做的事情,并将原始令牌存储在其他地方,如果你想在以后与它进行比较的话。

相关问题