国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - MongoDB - 使用mongoose和bcrypt實現用戶密碼加密的示例

使用mongoose和bcrypt實現用戶密碼加密的示例

2020-05-17 16:27小火柴的藍色理想 MongoDB

下面小編就為大家分享一篇使用mongoose和bcrypt實現用戶密碼加密的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

前面的話

最近在做的個人項目中,需要對密碼進行加密保存,對該操作的詳細步驟記錄如下

介紹

關于mongoose已經寫過博客就不再贅述,下面主要介紹bcrypt

bcrypt是一個由兩個外國人根據Blowfish加密算法所設計的密碼散列函數。實現中bcrypt會使用一個加鹽的流程以防御彩虹表攻擊,同時bcrypt還是適應性函數,它可以借由增加迭代之次數來抵御暴力破解法

使用npm安裝即可

?
1
npm install --save bcrypt

用戶模型

下面來創建代碼用戶user的schema,用戶名不能重復

?
1
2
3
4
5
6
7
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前置鉤子,在密碼保存之前,自動地把密碼變成hash。詳細代碼如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let SALT_WORK_FACTOR = 5
UserSchema.pre('save', function(next) {
 var user = this;
 //產生密碼hash當密碼有更改的時候(或者是新密碼)
 if (!user.isModified('password')) return next();
 // 產生一個salt
 bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
  if (err) return next(err);
  // 結合salt產生新的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默認使用的是10,這里設置為5

驗證

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

?
1
2
3
4
5
6
UserSchema.methods.comparePassword = function(candidatePassword, cb) {
 bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
  if (err) return cb(err);
  cb(null, isMatch);
 });
};

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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);

測試

把上面的代碼保存成user-model.js,然后運行下面代碼來實際測試

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
  });
 });
});

控制臺中輸入如下數據:

使用mongoose和bcrypt實現用戶密碼加密的示例

數據庫數據如下:

使用mongoose和bcrypt實現用戶密碼加密的示例

以上這篇使用mongoose和bcrypt實現用戶密碼加密的示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/xiaohuochai/p/8440272.html

延伸 · 閱讀

精彩推薦
  • MongoDBMongoDB 內存使用情況分析

    MongoDB 內存使用情況分析

    都說 MongoDB 是個內存大戶,但是怎么知道它到底用了多少內存呢...

    MongoDB教程網10002020-09-29
  • MongoDB遷移sqlserver數據到MongoDb的方法

    遷移sqlserver數據到MongoDb的方法

    這篇文章主要介紹了遷移sqlserver數據到MongoDb的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    聽楓xl9682021-01-03
  • MongoDB分布式文檔存儲數據庫之MongoDB分片集群的問題

    分布式文檔存儲數據庫之MongoDB分片集群的問題

    這篇文章主要介紹了分布式文檔存儲數據庫之MongoDB分片集群的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋...

    Linux-18743072020-12-20
  • MongoDBMongoDB憑什么躋身數據庫排行前五

    MongoDB憑什么躋身數據庫排行前五

    MongoDB以比去年同期超出65.96分的成績繼續雄踞榜單前五,這個增幅在全榜僅次于PostgreSQL的77.99,而其相對于4月份的6.10分的增長也是僅次于微軟SQL Server排名...

    孫浩峰3892020-05-22
  • MongoDBMongoDB中javascript腳本編程簡介和入門實例

    MongoDB中javascript腳本編程簡介和入門實例

    作為一個數據庫,MongoDB有一個很大的優勢——它使用js管理數據庫,所以也能夠使用js腳本進行復雜的管理——這種方法非常靈活 ...

    MongoDB教程網6982020-04-24
  • MongoDBmongodb基本命令實例小結

    mongodb基本命令實例小結

    這篇文章主要介紹了mongodb基本命令,結合實例形式總結分析了MongoDB數據庫切換、查看、刪除、查詢等基本命令用法與操作注意事項,需要的朋友可以參考下...

    dawn-liu3652020-05-26
  • MongoDBMongodb實現定時備份與恢復的方法教程

    Mongodb實現定時備份與恢復的方法教程

    這篇文章主要給大家介紹了Mongodb實現定時備份與恢復的方法教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面...

    chenjsh364522020-05-13
  • MongoDBMongoDB安裝圖文教程

    MongoDB安裝圖文教程

    這篇文章主要為大家詳細介紹了MongoDB安裝圖文教程,分為兩大部分為大家介紹下載MongoDB和安裝MongoDB的方法,感興趣的小伙伴們可以參考一下 ...

    Yangyi.He6132020-05-07
主站蜘蛛池模板: 精久久久 | 国产在线精品一区二区三区 | 国产精品网站在线观看 | 亚洲国产精品99久久久久久久久 | 伊人中文 | 欧美黄色电影在线 | 国产成人精品一区二区三区四区 | 91精品国产综合久久香蕉922 | 午夜视频在线观看网站 | 久久精品国产一区二区三区不卡 | 久久男人的天堂 | 一级毛片免费视频 | 在线成人免费电影 | 国产成人黄色片 | 天天干一干| 午夜精品在线 | 激情综合色综合久久综合 | 国产精品无码久久久久 | 日韩国产| 自拍偷拍 欧美日韩 | 黄色美女网站视频 | 欧美日韩精品一区 | 亚洲国产中文字幕 | 天天干天天草 | 一级国产 | 综合久久久久 | 国产亚洲欧美美 | 色狠狠一区 | 亚洲国产精品一区二区第一页 | 亚洲成人av在线 | 黄色免费网站视频 | 国产精品一区二区三区在线播放 | 亚洲精品视频在线看 | 久久69精品久久久久久久电影好 | 亚洲精彩视频在线 | 99久久久无码国产精品 | 久久综合一区 | 在线观看亚洲一区二区三区 | 天天天干夜夜夜操 | 欧美精品在线一区二区三区 | 搞黄在线观看 |