当前位置: 首页 > 知识库问答 >
问题:

为什么我从bcrypt compare得到isMatch null,即使两个密码字符串完全匹配?

穆城
2023-03-14

我正在尝试根据密码对用户进行身份验证。我正在使用bcrypt compare来比较用户请求的密码和mongodb中的一个,但是即使两个密码完全匹配,我也得到了空值,下面是我正在尝试的代码

userSchema.methods.comparePassword = function (passw, cb) {
    var user = this;
    console.log((passw === user.password) ? 'passwords match' : 'passwords dont match' );
    bcrypt.compare(passw, user.password, function (err, isMatch) {
        console.log(passw +" "+ user.password +" " +isMatch )
        if(err) {
            return cb(err)
        }
        cb(null, isMatch)
    })
}

我得到的控制台输出如下所示

sh37xb sh37xb空

其中包括用户输入的密码、该用户在数据库中的密码以及isMatch值,而isMatch值为null,因为两个密码完全匹配,所以必须相反。当我用三进制条件检查这个密码时,它显示“密码匹配”,但不是用bcrypt.compare。我做错了什么?有谁能帮我指出我的错误吗??

共有1个答案

叶经略
2023-03-14

bcrypt.compare的第二个参数应该是散列的,而不是纯文本字符串。

Bcrypt compare不将纯文本密码与另一个纯文本密码进行比较。它计算纯文本密码的哈希值,并将其与作为第二个参数提供的先前哈希值进行比较,以查看哈希值是否匹配。

使用bcrypt compare的典型原因是它比字符串比较更安全。要使其为真,密码数据库需要包含散列密码,而不是纯文本密码。一个纯文本密码的数据库是一个诱人的东西窃取。散列字符串的数据库就不那么有用了。

bcrypt的npm页面给出了以下示例:

To check a password:
// Load hash from your password DB.
bcrypt.compare(myPlaintextPassword, hash, function(err, result) {
    // result == true
});
bcrypt.compare(someOtherPlaintextPassword, hash, function(err, result) {
    // result == false
});
 类似资料:
  • 问题内容: 我有一个字符串,其中单词“ LOCAL”多次出现。我使用该函数搜索该单词,但它也返回另一个单词“ Locally”。我如何准确匹配“本地”一词? 问题答案: 对于这种事情,正则表达式非常有用: \ b基本上表示单词边界。可以是空格,标点符号等。 编辑评论: 显然,如果您不想忽略这种情况,则可以删除flags = re.IGNORECASE。

  • 情况是这样的。我正在根据从数据库获取的数据动态生成要在JPanel上显示的组件。系统会提示用户输入一个整数,并根据该整数进行一些计算。输出应以十进制值形式给出。因此,我将答案分配给了一个double,并使用decimalformat进行格式化。 当我将double值传递给DecimalFormat的format()方法时,即使我没有输入任何值为0,也会出现错误。 生成错误的代码段, 请考虑变量和是

  • 我用RSA算法加密和解密。当我加密一个字符串时,它工作正常。当我解密时,我得到一个错误。下面,我发布我的代码。

  • 问题内容: 在Swing中,密码字段具有(returns )方法,而不是通常的(returns )方法。同样,我也遇到了不建议使用密码的建议。 为什么涉及密码安全性受到威胁?使用起来感觉不方便。 问题答案: 字符串是不可变的。这意味着一旦创建了,如果另一个进程可以转储内存,则除了反射之外,你将无法清除数据,然后再进行垃圾回收。 使用数组,你可以在使用完数据后显式擦除数据。你可以用任何你喜欢的东西覆

  • 例如,我想忽略这个字符串123 456 78912,但是正则表达式匹配了前三个字符,所以它返回true。有没有办法在不创建新正则表达式的情况下做到这一点? 正则表达式还必须匹配以下内容: 0(123)456-789-ABcd 0 (123) 456 (123) 234 345-456 1111111111111 1 123 123 123 123 123个 123-(456) 123 (456)

  • 问题内容: 我会在开头提到这个问题,尽管我离正则表达式专家很远,但是它们对我来说并不完全陌生。对于我来说,构建正则表达式来搜索特定字符串中的模式通常不是问题,但是我有一个(也许是?)独特的情况。 我有一组价值观,例如: 028938 DEF567987 390987.456 GHI345928.039 我想匹配一组特定的字符串,例如: 完全由6位数字组成的字符串 字符串,由正好6位数字,十进制组成