a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 數(shù)據(jù)庫(kù) > MongoDB > 正文

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

2020-03-14 12:50:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前面的話

最近在做的個(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 = 5UserSchema.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 uservar testUser = new User({ username: 'jmar777', password: 'Password123'});// save user to databasetestUser.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ù):

mongoose,bcrypt,用戶,密碼,加密

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

mongoose,bcrypt,用戶,密碼,加密

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到MongoDB頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 一区二区免费看 | 91久久国产综合久久 | 成人免费视频www在线观看我 | 成人精品一区二区三区电影黑人 | 亚洲日韩视频免费观看 | 国产精品91av | 日日噜噜噜夜夜爽爽狠狠小说 | 欧美激情综合色综合啪啪五月 | 午夜黄色av| 男女靠逼免费视频 | 亚洲精品视频在线播放 | 久久亚洲春色中文字幕久久久 | 精品亚洲视频在线观看 | 欧美成人在线网站 | 日韩www| 99爱免费视频 | 伊人欧美在线 | 欧美大片免费看 | 自拍偷拍视频网站 | 国产精品成人在线 | 污网站在线免费看 | 国产在线二区 | 国产精品高潮呻吟久久a | 亚洲国产精品一区二区久久 | 一区二区在线视频 | 国产欧美一区二区精品性色 | 亚洲第一视频网站 | 国产在线一区二区三区在线观看 | 97人人人| 少妇被粗大的猛烈进大胸视频 | 日本亚洲欧美 | 欧美日韩一区二区视频在线观看 | jjzz日本| 日韩久久一区 | 九九av | 欧美五月| 国产男女视频在线观看 | 久久伊人免费视频 | 久在线视频 | 欧美在线播放一区二区 | 国产一级免费 |