深入解析Express下采用bcryptjs進行密碼加密

前端攻城小牛發表於2018-12-30

本篇文章主要介紹了Express下采用bcryptjs進行密碼加密的方法,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。

深入解析Express下采用bcryptjs進行密碼加密

bcrypt,是一個跨平臺的檔案加密工具。由它加密的檔案可在所有支援的作業系統和處理器上進行轉移。它的口令必須是8至56個字元,並將在內部被轉化為448位的金鑰。 除了對您的資料進行加密,預設情況下,bcrypt 在刪除資料之前將使用隨機資料三次覆蓋原始輸入檔案,以阻撓可能會獲得您的計算機資料的人恢復資料的嘗試。如果您不想使用此功能,可設定禁用此功能。 bcrypt 使用的是布魯斯·施內爾在1993年釋出的 Blowfish 加密演算法。具體來說,bcrypt 使用保羅·柯切爾的演算法實現。隨 bcrypt 一起釋出的原始碼對原始版本作了略微改動。

Express下bcryptjs的使用步驟:

1.安裝bcryptjs模組

npm install bcryptjs --save
複製程式碼

2.在需要加密的模組中引入bcryptjs庫

var bcrypt = require('bcryptjs');
複製程式碼

3.設定加密強度

var salt = bcrypt.genSaltSync(10);
複製程式碼

4.註冊時生成HASH值,並插入資料庫

router.post('/register', function(req, res, next){
  // 從連線池獲取連線
  pool.getConnection(function(err, connection) {
    // 獲取前臺頁面傳過來的引數
    var param = req.query || req.params;
    /*生成HASH值*/
    var hash = bcrypt.hashSync(param.pwd,salt);
    // 建立連線 新增使用者
    connection.query(userSQL.insert, ["",hash,param.phone,"","","",0], function(err, result) {
      res.send(result);
      // 釋放連線
      connection.release();
    });/歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:619586920
  });
});
複製程式碼

5.登入時驗證HASH值,並插入資料庫

router.post('/login', function(req, res, next){
  // 從連線池獲取連線
  pool.getConnection(function(err, connection) {
    // 獲取前臺頁面傳過來的引數
    var param = req.query || req.params;
    // 建立連線 根據手機號查詢密碼
    connection.query(userSQL.getPwdByPhoneNumber, [param.phone], function(err, result) {
      if(bcrypt.compareSync(param.pwd,result[0].password)){
        res.send("1");
        connection.query(userSQL.updateLoginStatusById, [1,result[0].id], function(err, result) {
        });
      }else{
        res.send("0");
      }/歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:619586920
      // 釋放連線
      connection.release();
    });
  });
});
複製程式碼

以上採用的是bcryptjs的同步用法,下面介紹非同步用法: 生成hash密碼:

bcrypt.genSalt(10, function(err, salt) {
  bcrypt.hash("B4c0/\/", salt, function(err, hash) {
    // Store hash in your password DB.
  });/歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:619586920
});
複製程式碼

密碼驗證:

bcrypt.compare("B4c0/\/", hash).then((res) => {
  // res === true
});/歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:619586920
複製程式碼

下面是使用Bcrypt對資料加密的一個簡單的栗子:

var mongoose = require('mongoose');
// 引入bcrypt模組
var bcrypt = require('bcrypt');
// 定義加密密碼計算強度
var SALT_WORK_FACTOR = 10;
/歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:619586920 
// 連線資料庫
mongoose.connect('mongodb://localhost:27017/test')
 
// 定義使用者模式
var UserSchema = new mongoose.Schema({
  name: {
    unique: true,
    type: String
  },
  password: {
    unique: true,
    type: String
  }
},{ collection: "user"});
 
// 使用pre中介軟體在使用者資訊儲存前進行密碼加密
UserSchema.pre('save', function(next){
  var user = this;
 
  // 進行加密(加鹽)
  bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt){
    if(err){
      return next(err);
    }
    bcrypt.hash(user.password, salt, function(err, hash){
      if(err){
        return next(err);
      }
      user.password = hash;
      next();
    })
  });
});
/歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:619586920 
// 編譯模型
var UserBox = mongoose.model('UserBox', UserSchema);
 
// 建立文件物件例項
var user = new UserBox ({
  name : "Jack" ,
  password : "123456"
});
 
// 儲存使用者資訊
user.save(function(err, user){
  if(err){
    console.log(err);
  }else{
    // 如果儲存成功,列印使用者密碼
    console.log("password: " + user.password);
  }/歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:619586920
})
複製程式碼

結語

感謝您的觀看,如有不足之處,歡迎批評指正。

本次給大家推薦一個免費的學習群,裡面概括移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。 對web開發技術感興趣的同學,歡迎加入Q群:864305860,不管你是小白還是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時每天更新視訊資料。 最後,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰。

相關文章