java nodejs中的验证过程中出现错误

c6ubokkw  于 2023-06-28  发布在  Java
关注(0)|答案(5)|浏览(140)

我是JavaScript和nodejs的新手,我写了一段代码来从数据库中的密码和盐中进行用户身份验证,下面是nodejs中的代码,我收到了一个usercode和密码,我从数据库中检索数据,并将数据库中的密码和盐与收到的密码进行比较。
存储在DB中的盐是以base64格式生成的。

var Bcrypt = require('bcrypt');   
var pg = require('pg');
var usercode = 'tarun';
var clientid='214057357158656';
var password='tarun';
var connectionString = "postgres://dbusername:password@localhost:5432/USCProduction";
console.log('connectin to DB');
var client = new pg.Client(connectionString);
client.connect(function(err) {   

    if(err) {
        console.log(err);
      }
    var Query ='select password, salt from muser, mclient where usercode='+"'"+usercode+"'"+' and muser.clientid='+clientid+' and muser.clientid=mclient.clientid and mclient.status=1';
    console.log('executing query',Query);
    client.query(Query, function(err, result) {

   if(err){
       console.log('Error in executing Query');
       client.end();
   } else {
       console.log(result.rows);
       var passinDB=result.rows[0].password;
       var saltinDB=result.rows[0].salt;
       console.log('passwordinDB : ',passinDB);
       console.log('saltinDB : ',saltinDB);
 client.end();
    Bcrypt.hash(passinDB, saltinDB, function(err, hash) {
        if(err) {
                return console.error(err);
        }
        console.log(hash);
    Bcrypt.compare(password, hash, function(err, isMatch) {
        if(err) {
                return console.error(err);
        }
        console.log('do they match?', isMatch);
    });

});
   }
    });
});

我在执行代码时遇到以下错误

passwordinDB :  StAxL1r3bb/5k/6D6+BulwxhXFs=
saltinDB :  FOhs8crXyO8=
    [Error: Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue]

它无法找到盐的轮次数或任何其他i可能在代码中丢失,如何克服这个错误。
感谢您的评分!

hpxqektj

hpxqektj1#

一种可读的生成方式:

const bcrypt = require("bcryptjs")

const hash = async (text, size) => {
    try {
        const salt = await bcrypt.genSalt(size);

        const hash = await bcrypt.hash(text, salt);

        return hash
    } catch(error) {
        console.log(error)
    }
}
omqzjyyz

omqzjyyz2#

将saltinDB转换为int

saltinDB = parseInt(saltinDB)
xdnvmnnf

xdnvmnnf3#

在这一行
盐必须以以下形式存在:$Vers$log2(NumRounds)$saltvalue]

$Vers是bcrypt_id
**$log2(NumRounds)**是一个参数,告诉它执行内部哈希函数的次数。

所以你需要生成盐,并以这种方式拥有密码:

var bcrypt = require('bcryptjs');
bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash("any_password", salt, function(err, hash) {
        // Store hash in your password DB.
    });
});

阅读更多here

zz2j4svz

zz2j4svz4#

另一个可能的解决方案与承诺

bcrypt.genSalt(10)
    .then(
        salt => {
            bcrypt.hash(password, salt)
                .then(hash => {
                    console.log(`INFO: Hash generated: ${hash}`)
                        // Store hash in your password DB.
                });
        }
    ).catch(err => console.log(err));

控制台

jmendoza@jmendoza-ThinkPad-T420:~/IdeaProjects/NodeJS-API-Course/Intermediate-Node-API$ npm run dev

> intermediate-node-api@1.0.0 dev /home/jmendoza/IdeaProjects/NodeJS-API-Course/Intermediate-Node-API
> nodemon src/app.js

[nodemon] 2.0.3
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node src/app.js`
INFO: A NodeJS API is listining on port: 3000
INFO: mongoDB, Atlas. Connected
INFO: SALT: 15
POST /api/v1/users 200 28.146 ms - 40
INFO: Hash generated: $2b$10$1/4o27jmhscGEgTyF54NQurLbZvXI9zFROZKhlm0EoHsBE24NTAVu

你可以在我的代码库中看到完整的代码:
https://github.com/JonathanM2ndoza/NodeJS-API-Course/blob/master/Advanced-Node-API/src/modules/encrypt.ts

tp5buhyn

tp5buhyn5#

bcrypt.genSalt(10).then(salt => { bcrypt.hash(password,salt).then(hash => { console.log(INFO: Hash generated: ${hash})//将hash存储在密码数据库中。}); }).catch(err => console.log(err));现在这对我起作用了

相关问题