国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

node中的密碼安全(加密)

來源:懂視網 責編:小采 時間:2020-11-27 22:07:31
文檔

node中的密碼安全(加密)

node中的密碼安全(加密):本文將講解對于前后端分離的項目,前端注冊或登錄時如何保證用戶密碼安全傳輸到server端,最終存入數據庫 為什么需要加密 加密真的有必要嗎? 我們先來看一看前端發起的ajax請求中,如果不對密碼進行加密,會發生什么。 f12打開chrome開發者工具,找到請
推薦度:
導讀node中的密碼安全(加密):本文將講解對于前后端分離的項目,前端注冊或登錄時如何保證用戶密碼安全傳輸到server端,最終存入數據庫 為什么需要加密 加密真的有必要嗎? 我們先來看一看前端發起的ajax請求中,如果不對密碼進行加密,會發生什么。 f12打開chrome開發者工具,找到請

本文將講解對于前后端分離的項目,前端注冊或登錄時如何保證用戶密碼安全傳輸到server端,最終存入數據庫

為什么需要加密

加密真的有必要嗎?

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

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

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

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

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

流程圖

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

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

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

注意: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的方法進行解密。

最后

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

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

當然,關于網絡安全是一個大話題,本篇只是對其中的一小部分進行介紹,歡迎留言討論,希望對您有幫助。,也希望大家多多支持腳本之家。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

node中的密碼安全(加密)

node中的密碼安全(加密):本文將講解對于前后端分離的項目,前端注冊或登錄時如何保證用戶密碼安全傳輸到server端,最終存入數據庫 為什么需要加密 加密真的有必要嗎? 我們先來看一看前端發起的ajax請求中,如果不對密碼進行加密,會發生什么。 f12打開chrome開發者工具,找到請
推薦度:
標簽: 加密 的密碼 里面
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 精品综合 | 亚洲精国产一区二区三区 | 亚洲精国产一区二区三区 | 日韩欧美一区二区三区不卡在线 | 中文字幕有码在线观看 | 美国一级大黄大色毛片 | 一区二区视频在线 | 永久免费观看的毛片的网站下载 | 欧美亚洲图区 | 亚洲精品影院久久久久久 | 在线观看国产精品入口 | 久久国产精品最新一区 | 欧美日韩中文 | 日韩亚洲欧美一区 | 九九热精品在线观看 | 激情欧美日韩一区二区 | 久国产精品视频 | 日本美女逼逼 | 国产91久久久久久久免费 | 久久艹精品 | 99热免费 | 中文亚洲欧美日韩无线码 | 91麻豆国产精品91久久久 | 婷婷久草 | 全黄毛片| 久久国产一级毛片一区二区 | 图片专区亚洲 欧美 另类 | 精品国产一区二区在线观看 | 免费看男女做好爽好硬视频 | 日韩阿v | 久久久久女人精品毛片九一 | 国内一区二区三区精品视频 | 亚洲欧洲在线视频 | 国产在线不卡 | 欧美日韩视频在线播放 | 欧美色图亚洲自拍 | 日韩无 | 91精品国产91久久久久福利 | 精品国产91乱码一区二区三区 | 国产中文在线观看 | 国产v欧美v日韩在线观看 |