bcrypt单向加密的使用 和 密钥yuè比对的使用方法

1,610 阅读1分钟

今天才知道密钥yuè的正确读音,我一个语言学硕士栽在这上面25年,⊙﹏⊙b汗, 写文章的时候输入法提醒我知道我读错了。

首先引入 bcrypt 插件

cnpm i bcrypt --save

给明文加密

bcrypt.genSalt, bcrypt.hash 都是异步执行, 所以要在里面进行对secret赋值操作。

如果使用同步方法,

要使用 bcrypt.genSaltSync(rounds) bcrypt.hashSync(data, salt) 用法和同步都是一样的, 只不过异步方法没有回调函数参数, 是返回布尔值

const bcrypt = require('bcrypt');

let password = 'hello world' //待加密的明文密码

let saltRounds = 10; //saltRounds: 正数,代表hash杂凑次数,数值越高越安全,默认10次。

// bcrypt是单向Hash加密算法 不能反向破解

var secret; 这个将会是加密后的密码,稍后用来比对

//bcrypt.genSalt是异步执行
bcrypt.genSalt(saltRounds, (err, salt) => {
    //salt 是一串加密字符串, 128bits随机字符串,22字符, 会成为hash密码前面的一段
    // console.log({ salt: salt })
    
    //bcrypt.hash 是异步执行 
    bcrypt.hash(password, salt, function (err, hash) {
        if (err) throw err;
        console.log(hash)
        secret = hash;
        // 经过明文密码password和salt进行hash进行saltRounds次循环hash10次,得到的密码
        // 输出结果, 因为是数字加密,所以每次都是不一样的 , 后续要使用bcrypt.compare进行比较: 
        // 比如 :{ salt: '$2b$10$KnabCCverzpNFeHIbYgo4u' }
        //          {hash:'$2b$10$KnabCCverzpNFeHIbYgo4uTrcWEoJGvj5IBByoJLJ6iZKXq4BYdJS'}           
    });
})

比对方法

bcrypt.compare(data明文, hash加密密码, cb回调函数)

也是异步方法,同步的话使用 compareSync(data, hash) 接收 return 传过来的布尔值


bcrypt.compare(password, secret, (err, result) => {
    err ? console.log(err) : console.log(result)
})

如果报错:Error: data and hash arguments required

检查 bcrypt.compare 第二个参数是否为undefined;