溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在node中對密碼進行加密

發布時間:2021-01-18 16:54:32 來源:億速云 閱讀:512 作者:Leah 欄目:web開發

本篇文章為大家展示了怎么在node中對密碼進行加密,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

為什么需要加密

加密真的有必要嗎?

我們先來看一看前端發起的ajax請求中,如果不對密碼進行加密,會發生什么。

f12打開chrome開發者工具,找到請求,查看請求參數如下:

怎么在node中對密碼進行加密

如果你的協議是http,那么前端傳給后端的密碼差不多是裸奔狀態,因為http傳輸的是明文,很可能在傳輸過程中被竊聽,偽裝或篡改。

那么,弄個https不就好了嗎?

https的確能夠極大增加網站的安全性,但是用https得先買證書(也有免費的),對于個人站點或者不想弄證書的情況下,那最起碼也得對用戶密碼進行一下加密吧。

流程圖

先看一下大體流程圖,首先,我們用工具生成公鑰和私鑰,將其放入server端,前端發起請求獲取公鑰,拿到公鑰后對密碼進行加密,然后將加密后的密碼發送到server端,server端將用密鑰解密,最后再用sha1加密密碼,存入數據庫。

怎么在node中對密碼進行加密

生成RSA公鑰和密鑰

既然選擇RSA加密,那么首先得有工具啊,常見的有openssl,但這里不介紹,感興趣的請自行查閱,對于node而言,我介紹一個不錯的庫Node-RSA,我們將用它來生成RSA公鑰和密鑰。

RSA是一種非對稱加密算法,即由一個密鑰和一個公鑰構成的密鑰對,通過密鑰加密,公鑰解密,或者通過公鑰加密,密鑰解密。其中,公鑰可以公開,密鑰必須保密。

用Node-RSA生成的公鑰和密鑰代碼如下:

const NodeRSA = require('node-rsa')
const fs = require('fs')

// Generate new 512bit-length key
var key = new NodeRSA({b: 512})
key.setOptions({encryptionScheme: 'pkcs1'})

var privatePem = key.exportKey('pkcs1-private-pem')
var publicDer = key.exportKey('pkcs8-public-der')
var publicDerStr = publicDer.toString('base64')

// 保存返回到前端的公鑰
fs.writeFile('./pem/public.pem', publicDerStr, (err) => {
 if (err) throw err
 console.log('公鑰已保存!')
})
// 保存私鑰
fs.writeFile('./pem/private.pem', privatePem, (err) => {
 if (err) throw err
 console.log('私鑰已保存!')
})

執行完成后,我們將在根目錄下得到公鑰和私鑰文件:

怎么在node中對密碼進行加密

注意:server端的公鑰和密鑰應該隔一段時間換一次,比如每次服務器重啟時。

前端加密

核心代碼如下:

 <script src="https://cdn.bootcss.com/jsencrypt/2.3.1/jsencrypt.min.js"></script>
 <script src="https://cdn.bootcss.com/axios/0.18.0/axios.min.js"></script>
 <script>
  function reg() {
   axios({
    method: 'post',
    url: 'http://127.0.0.1:3000/getPublicKey'
   })
    .then(res => {
     let result = res.data

     // 從后端獲取的公鑰 String
     var publicPem = result
     // 用JSEncrypt對密碼進行加密
     var encrypt = new JSEncrypt()
     encrypt.setPublicKey(publicPem)
     var password = 'abc123'
     password = encrypt.encrypt(password)

     axios({
      method: 'post',
      url: 'http://127.0.0.1:3000/reg',
      data: {
       password: password
      }
     })
      .then(res => {
       let result = res.data
       console.log(result)
      })
      .catch(error => {
       console.log(error)
      })
    })
  }
 </script>

前端將用到jsencrypt對其進行加密,詳細用法請參考github。

后端解密

后端核心代碼:

const express = require('express');
const crypto = require('crypto');
const fs = require('fs');

var privatePem = fs.readFileSync('./pem/private.pem');

var app = express();
app.use(express.json());

// CORS 注意:要放在處理路由前
function crossDomain(req, res, next) {
 res.header('Access-Control-Allow-Origin', '*');
 res.header('Access-Control-Allow-Headers', 'Content-Type');

 next();
}
app.use(crossDomain)

app.use(function (req, res, next) {
 // 不加會報錯
 if (req.method === 'OPTIONS') {
  res.end('ok')
  return
 }

 switch (req.url) {
  case '/getPublicKey':
   let publicPem = fs.readFileSync('./pem/public.pem', 'utf-8')
   res.json(publicPem)
   break
  case '/reg':
   // 解密
   var privateKey = fs.readFileSync('./pem/private.pem', 'utf8')
   var password = req.body.password
   var buffer2 = Buffer.from(password, 'base64')
   var decrypted = crypto.privateDecrypt(
    {
     key: privateKey,
     padding: crypto.constants.RSA_PKCS1_PADDING // 注意這里的常量值要設置為RSA_PKCS1_PADDING
    },
    buffer2
   )
   console.log(decrypted.toString('utf8'))

   // sha1加密
   var sha1 = crypto.createHash('sha1');
   var password = sha1.update(decrypted).digest('hex');
   console.log('輸入到數據庫中的密碼是: ', password)
   // 存入數據庫中
   // store to db...
   res.end('reg ok')
   break
 }
})

app.listen(3000, '127.0.0.1')

這里,我是用node自帶模塊crpto進行解密,當然,你也可以用Node-RSA的方法進行解密。

最后

我們再來看一看前端請求的密碼信息:

怎么在node中對密碼進行加密

這樣一串字符,即便被他人獲取,如果沒有密鑰,在一定程度上,他是無法知道你的密碼的。

上述內容就是怎么在node中對密碼進行加密,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女