最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用mongoose和bcrypt實(shí)現(xiàn)用戶密碼加密的示例

 更新時(shí)間:2018年02月11日 08:38:27   作者:小火柴的藍(lán)色理想  
下面小編就為大家分享一篇使用mongoose和bcrypt實(shí)現(xiàn)用戶密碼加密的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

前面的話

最近在做的個(gè)人項(xiàng)目中,需要對(duì)密碼進(jìn)行加密保存,對(duì)該操作的詳細(xì)步驟記錄如下

介紹

關(guān)于mongoose已經(jīng)寫過(guò)博客就不再贅述,下面主要介紹bcrypt

bcrypt是一個(gè)由兩個(gè)外國(guó)人根據(jù)Blowfish加密算法所設(shè)計(jì)的密碼散列函數(shù)。實(shí)現(xiàn)中bcrypt會(huì)使用一個(gè)加鹽的流程以防御彩虹表攻擊,同時(shí)bcrypt還是適應(yīng)性函數(shù),它可以借由增加迭代之次數(shù)來(lái)抵御暴力破解法

使用npm安裝即可

npm install --save bcrypt

用戶模型

下面來(lái)創(chuàng)建代碼用戶user的schema,用戶名不能重復(fù)

var mongoose = require('mongoose'),
 Schema = mongoose.Schema,
 bcrypt = require('bcrypt');var UserSchema = new Schema({
 username: { type: String, required: true, index: { unique: true } },
 password: { type: String, required: true }
});
module.exports = mongoose.model('User', UserSchema);

加密

下面加入用戶模型的是Mongoose的中間件,該中間件使用pre前置鉤子,在密碼保存之前,自動(dòng)地把密碼變成hash。詳細(xì)代碼如下

let SALT_WORK_FACTOR = 5
UserSchema.pre('save', function(next) {
 var user = this;
 //產(chǎn)生密碼hash當(dāng)密碼有更改的時(shí)候(或者是新密碼)
 if (!user.isModified('password')) return next();
 // 產(chǎn)生一個(gè)salt
 bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
  if (err) return next(err);
  // 結(jié)合salt產(chǎn)生新的hash
  bcrypt.hash(user.password, salt, function(err, hash) {
   if (err) return next(err);
   // 使用hash覆蓋明文密碼
   user.password = hash;
   next();
  });
 });
});

在node.bcrypt.js中SALT_WORK_FACTOR默認(rèn)使用的是10,這里設(shè)置為5

驗(yàn)證

加密之后,密碼原文被替換為密文了。我們無(wú)法解密,只能通過(guò)bcrypt的compare方法,對(duì)再次傳入的密碼和數(shù)據(jù)庫(kù)中保存的加密后的密碼進(jìn)行比較,如果匹配,則登錄成功

UserSchema.methods.comparePassword = function(candidatePassword, cb) {
 bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
  if (err) return cb(err);
  cb(null, isMatch);
 });
};

把上面的幾個(gè)步驟串在一起,完整代碼如下

var mongoose = require('mongoose'),
 Schema = mongoose.Schema,
 bcrypt = require('bcrypt'),
 SALT_WORK_FACTOR = 5;
var UserSchema = new Schema({
 username: { type: String, required: true, index: { unique: true } },
 password: { type: String, required: true }
});
UserSchema.pre('save', function(next) {
 var user = this;
 // only hash the password if it has been modified (or is new)
 if (!user.isModified('password')) return next();
 // generate a salt
 bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
  if (err) return next(err);
  // hash the password using our new salt
  bcrypt.hash(user.password, salt, function(err, hash) {
   if (err) return next(err);
   // override the cleartext password with the hashed one
   user.password = hash;
   next();
  });
 });
});
UserSchema.methods.comparePassword = function(candidatePassword, cb) {
 bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
  if (err) return cb(err);
  cb(null, isMatch);
 });
};
module.exports = mongoose.model('User', UserSchema);

測(cè)試

把上面的代碼保存成user-model.js,然后運(yùn)行下面代碼來(lái)實(shí)際測(cè)試

var mongoose = require('mongoose'),
 User = require('./user-model');
var connStr = 'mongodb://localhost:27017/mongoose-bcrypt-test';
mongoose.connect(connStr, function(err) {
 if (err) throw err;
 console.log('Successfully connected to MongoDB');
});
// create a user a new user
var testUser = new User({
 username: 'jmar777',
 password: 'Password123'
});
// save user to database
testUser.save(function(err) {
 if (err) throw err;
 // fetch user and test password verification
 User.findOne({ username: 'jmar777' }, function(err, user) {
  if (err) throw err;
  // test a matching password
  user.comparePassword('Password123', function(err, isMatch) {
   if (err) throw err;
   console.log('Password123:', isMatch); // -> Password123: true
  });
  // test a failing password
  user.comparePassword('123Password', function(err, isMatch) {
   if (err) throw err;
   console.log('123Password:', isMatch); // -> 123Password: false
  });
 });
});

控制臺(tái)中輸入如下數(shù)據(jù):

數(shù)據(jù)庫(kù)數(shù)據(jù)如下:

以上這篇使用mongoose和bcrypt實(shí)現(xiàn)用戶密碼加密的示例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MongoDB分片的實(shí)現(xiàn)示例

    MongoDB分片的實(shí)現(xiàn)示例

    MongoDB的分片是一種橫向擴(kuò)展數(shù)據(jù)庫(kù)的方式,可以將數(shù)據(jù)分散存儲(chǔ)在多臺(tái)服務(wù)器上,從而提高數(shù)據(jù)庫(kù)的處理能力和可用性,本文就來(lái)介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • MongoDB創(chuàng)建和查詢視圖的方式

    MongoDB創(chuàng)建和查詢視圖的方式

    本文整理mongodb的官方文檔,介紹mongodb的視圖創(chuàng)建和查詢,在Mongodb中,允許使用兩種方式來(lái)創(chuàng)建視圖,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2023-12-12
  • 將MongoDB加入到Windows的本地服務(wù)項(xiàng)的方法

    將MongoDB加入到Windows的本地服務(wù)項(xiàng)的方法

    下面主要針對(duì)MongoDB在Windows下加入本地服務(wù)項(xiàng)做一些簡(jiǎn)單的分享。以方便剛接觸MongoDB并在Windows環(huán)境下進(jìn)行開(kāi)發(fā)的同學(xué)
    2014-08-08
  • MongoDB學(xué)習(xí)筆記—Linux下搭建MongoDB環(huán)境

    MongoDB學(xué)習(xí)筆記—Linux下搭建MongoDB環(huán)境

    本篇文章主要介紹了Linux下搭建MongoDB環(huán)境,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • 2021最新版windows10系統(tǒng)MongoDB數(shù)據(jù)庫(kù)安裝及配置環(huán)境

    2021最新版windows10系統(tǒng)MongoDB數(shù)據(jù)庫(kù)安裝及配置環(huán)境

    這篇文章主要介紹了2021最新版MongoDB數(shù)據(jù)庫(kù)安裝及配置環(huán)境(windows10系統(tǒng)),本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Navicat Premium連接mongodb詳細(xì)教程

    Navicat Premium連接mongodb詳細(xì)教程

    這篇文章主要介紹了Navicat Premium連接mongodb詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • MongoDB的主從復(fù)制及副本集的replSet配置教程

    MongoDB的主從復(fù)制及副本集的replSet配置教程

    MongoDB可以在以一個(gè)主節(jié)點(diǎn)處理客戶端請(qǐng)求的情況下以其他節(jié)點(diǎn)服務(wù)器負(fù)責(zé)映射主節(jié)點(diǎn)上的數(shù)據(jù),即為我們通常所說(shuō)的主從復(fù)制功能,這里我們就來(lái)共同總結(jié)MongoDB的主從復(fù)制及副本集的replSet配置教程:
    2016-07-07
  • 淺談MongoDB 關(guān)系

    淺談MongoDB 關(guān)系

    這篇文章主要介紹了MongoDB 關(guān)系的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • SpringBoot?集成MongoDB實(shí)現(xiàn)文件上傳功能

    SpringBoot?集成MongoDB實(shí)現(xiàn)文件上傳功能

    這篇文章主要介紹了SpringBoot?集成MongoDB實(shí)現(xiàn)文件上傳,主要通過(guò)示例代碼記錄文件上傳的步驟,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • MongoDB固定集合(capped collection)的知識(shí)小結(jié)

    MongoDB固定集合(capped collection)的知識(shí)小結(jié)

    固定集合指的是事先創(chuàng)建,并且大小固定的集合。下面這篇文章主要給大家總結(jié)介紹了MongoDB固定集合(capped collection)的知識(shí),文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10

最新評(píng)論

明光市| 维西| 建始县| 星座| 博白县| 三穗县| 万宁市| 玉树县| 锡林浩特市| 大港区| 万宁市| 尼勒克县| 迁西县| 松阳县| 乌恰县| 姚安县| 长汀县| 义乌市| 政和县| 阳泉市| 马公市| 天峻县| 修文县| 兴国县| 金山区| 横山县| 桃江县| 庆城县| 黔西县| 全椒县| 阿合奇县| 柳州市| 乌兰察布市| 古交市| 金塔县| 鹰潭市| 富源县| 垫江县| 霍城县| 法库县| 海安县|