欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

node中的密碼安全(加密)

 更新時(shí)間:2018年09月17日 13:44:06   作者:moddx  
這篇文章主要介紹了node中的密碼安全(加密),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

本文將講解對(duì)于前后端分離的項(xiàng)目,前端注冊(cè)或登錄時(shí)如何保證用戶(hù)密碼安全傳輸?shù)絪erver端,最終存入數(shù)據(jù)庫(kù)

為什么需要加密

加密真的有必要嗎?

我們先來(lái)看一看前端發(fā)起的ajax請(qǐng)求中,如果不對(duì)密碼進(jìn)行加密,會(huì)發(fā)生什么。

f12打開(kāi)chrome開(kāi)發(fā)者工具,找到請(qǐng)求,查看請(qǐng)求參數(shù)如下:

如果你的協(xié)議是http,那么前端傳給后端的密碼差不多是裸奔狀態(tài),因?yàn)閔ttp傳輸?shù)氖敲魑?,很可能在傳輸過(guò)程中被竊聽(tīng),偽裝或篡改。

那么,弄個(gè)https不就好了嗎?

https的確能夠極大增加網(wǎng)站的安全性,但是用https得先買(mǎi)證書(shū)(也有免費(fèi)的),對(duì)于個(gè)人站點(diǎn)或者不想弄證書(shū)的情況下,那最起碼也得對(duì)用戶(hù)密碼進(jìn)行一下加密吧。

流程圖

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

生成RSA公鑰和密鑰

既然選擇RSA加密,那么首先得有工具啊,常見(jiàn)的有openssl,但這里不介紹,感興趣的請(qǐng)自行查閱,對(duì)于node而言,我介紹一個(gè)不錯(cuò)的庫(kù)Node-RSA,我們將用它來(lái)生成RSA公鑰和密鑰。

RSA是一種非對(duì)稱(chēng)加密算法,即由一個(gè)密鑰和一個(gè)公鑰構(gòu)成的密鑰對(duì),通過(guò)密鑰加密,公鑰解密,或者通過(guò)公鑰加密,密鑰解密。其中,公鑰可以公開(kāi),密鑰必須保密

用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('私鑰已保存!')
})

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

注意:server端的公鑰和密鑰應(yīng)該隔一段時(shí)間換一次,比如每次服務(wù)器重啟時(shí)。

前端加密

核心代碼如下:

 <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對(duì)密碼進(jìn)行加密
     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對(duì)其進(jìn)行加密,詳細(xì)用法請(qǐng)參考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) {
 // 不加會(huì)報(bào)錯(cuò)
 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 // 注意這里的常量值要設(shè)置為RSA_PKCS1_PADDING
    },
    buffer2
   )
   console.log(decrypted.toString('utf8'))

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

app.listen(3000, '127.0.0.1')

這里,我是用node自帶模塊crpto進(jìn)行解密,當(dāng)然,你也可以用Node-RSA的方法進(jìn)行解密。

最后

我們?cè)賮?lái)看一看前端請(qǐng)求的密碼信息:

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

當(dāng)然,關(guān)于網(wǎng)絡(luò)安全是一個(gè)大話(huà)題,本篇只是對(duì)其中的一小部分進(jìn)行介紹,歡迎留言討論,希望對(duì)您有幫助。,也希望大家多多支持腳本之家。

相關(guān)文章

  • Node.js和Express簡(jiǎn)單入門(mén)介紹

    Node.js和Express簡(jiǎn)單入門(mén)介紹

    本篇文章主要介紹了Node.js和Express簡(jiǎn)單入門(mén)介紹,詳細(xì)介紹如何用Node.js和Express搭建一個(gè)web服務(wù)器,有興趣的可以了解一下。
    2017-03-03
  • node.js中的fs.chmod方法使用說(shuō)明

    node.js中的fs.chmod方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.chmod方法使用說(shuō)明,本文介紹了fs.chmod方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 詳解puppeteer使用代理

    詳解puppeteer使用代理

    這篇文章主要介紹了詳解puppeteer使用代理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • NodeJs通過(guò)async/await處理異步的方法

    NodeJs通過(guò)async/await處理異步的方法

    本篇文章主要介紹了NodeJs通過(guò)async/await處理異步的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Node.js程序中的本地文件操作用法小結(jié)

    Node.js程序中的本地文件操作用法小結(jié)

    這篇文章主要介紹了Node.js程序中的本地文件操作用法小結(jié),作為運(yùn)行在服務(wù)器端的JavaScript解釋器,Node中自然擁有操作本地文件的方法,需要的朋友可以參考下
    2016-03-03
  • Node.js + Redis Sorted Set實(shí)現(xiàn)任務(wù)隊(duì)列

    Node.js + Redis Sorted Set實(shí)現(xiàn)任務(wù)隊(duì)列

    本文給大家分享的是使用Node.js + Redis Sorted Set實(shí)現(xiàn)任務(wù)隊(duì)列的方法示例,非常的實(shí)用,有需要的小伙伴可以參考下
    2016-09-09
  • 快速掌握Node.js中setTimeout和setInterval的使用方法

    快速掌握Node.js中setTimeout和setInterval的使用方法

    這篇文章主要為大家介紹了快速掌握Node.js中setTimeout和setInterval的使用方法,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Node.js?全局變量無(wú)法掛載問(wèn)題解決分析

    Node.js?全局變量無(wú)法掛載問(wèn)題解決分析

    這篇文章主要為大家介紹了Node.js?全局變量無(wú)法掛載問(wèn)題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 在linux中使用包管理器安裝node.js

    在linux中使用包管理器安裝node.js

    這篇文章主要介紹了在linux中使用包管理器安裝node.js的方法以及具體安裝過(guò)程,非常詳細(xì),推薦給大家,有需要的小伙伴參考下吧。
    2015-03-03
  • nodejs中實(shí)現(xiàn)修改用戶(hù)路由功能

    nodejs中實(shí)現(xiàn)修改用戶(hù)路由功能

    這篇文章主要介紹了nodejs中實(shí)現(xiàn)修改用戶(hù)路由功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-05-05

最新評(píng)論