bcrypt
方式加密我在之前都是使用的md5的方式進行密碼加密,因爲md5存在必定的風險,並且這個這個依賴已經好久沒有更新了,故本次採用的是bcrypt
方式加密。算法
useage(command)npm
npm i bcrypt
const bcrypt = require('bcrypt'); const saltRounds = 10; const myPlaintextPassword = 's0/\/\P4$$w0rD'; const someOtherPlaintextPassword = 'not_bacon';
to hash a passwordpromise
//方式1: bcrypt.genSalt(saltRounds, function(err, salt) { bcrypt.hash(myPlaintextPassword, salt, function(err, hash) { // Store hash in your password DB. }); }); //方式2 bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) { // Store hash in your password DB. });
以上兩種方式均可以達到相同的加密結果安全
to check password異步
// Load hash from your password DB. bcrypt.compare(myPlaintextPassword, hash, function(err, res) { // 密碼正確,會返回的res爲true // res == true }); bcrypt.compare(someOtherPlaintextPassword, hash, function(err, res) { // 密碼不對,則返回的res 爲false // res == false });
值得注意的是:「比較」功能能夠對抗定時攻擊(使用所謂的「恆定時間」算法)。一般,若是密碼,加密密鑰或加密哈希與安全性相關,則不要使用常規JavaScript字符串比較函數來比較密碼,加密密鑰或加密哈希值。函數
promise
方式進行加密bcrypt使用global.Promise中可用的任何Promise實現。 NodeJS> = 0.12內置了一個本機Promise實現。可是,這應該適用於任何Promises / A +兼容的實現。ui
接受回調的異步方法,若是Promise支持可用,則在未指定回調時返回Promise。加密
useagecode
bcrypt.hash(myPlaintextPassword, saltRounds).then(function(hash) { // Store hash in your password DB. });
使用promise
方式驗證密碼是否一致ip
// Load hash from your password DB. // myPlaintextPassword 爲密碼, hash爲加密後的密碼 bcrypt.compare(myPlaintextPassword, hash).then(function(res) { // res == true }); bcrypt.compare(someOtherPlaintextPassword, hash).then(function(res) { // res == false });