摘要:后端解密后端核心代碼注意要放在處理路由前不加會(huì)報(bào)錯(cuò)解密注意這里的常量值要設(shè)置為加密輸入到數(shù)據(jù)庫(kù)中的密碼是存入數(shù)據(jù)庫(kù)中這里,我是用自帶模塊進(jìn)行解密,當(dāng)然,你也可以用的方法進(jìn)行解密。
本文將講解對(duì)于前后端分離的項(xiàng)目,前端注冊(cè)或登錄時(shí)如何保證用戶密碼安全傳輸?shù)絪erver端,最終存入數(shù)據(jù)庫(kù)為什么需要加密
加密真的有必要嗎?
我們先來看一看前端發(fā)起的ajax請(qǐng)求中,如果不對(duì)密碼進(jìn)行加密,會(huì)發(fā)生什么。
f12打開chrome開發(fā)者工具,找到請(qǐng)求,查看請(qǐng)求參數(shù)如下:
如果你的協(xié)議是http,那么前端傳給后端的密碼差不多是裸奔狀態(tài),因?yàn)閔ttp傳輸?shù)氖敲魑模芸赡茉趥鬏斶^程中被竊聽,偽裝或篡改。
那么,弄個(gè)https不就好了嗎?
https的確能夠極大增加網(wǎng)站的安全性,但是用https得先買證書(也有免費(fèi)的),對(duì)于個(gè)人站點(diǎn)或者不想弄證書的情況下,那最起碼也得對(duì)用戶密碼進(jìn)行一下加密吧。
先看一下大體流程圖,首先,我們用工具生成公鑰和私鑰,將其放入server端,前端發(fā)起請(qǐng)求獲取公鑰,拿到公鑰后對(duì)密碼進(jìn)行加密,然后將加密后的密碼發(fā)送到server端,server端將用密鑰解密,最后再用sha1加密密碼,存入數(shù)據(jù)庫(kù)。
既然選擇RSA加密,那么首先得有工具啊,常見的有openssl,但這里不介紹,感興趣的請(qǐng)自行查閱,對(duì)于node而言,我介紹一個(gè)不錯(cuò)的庫(kù)Node-RSA,我們將用它來生成RSA公鑰和密鑰。
RSA是一種非對(duì)稱加密算法,即由一個(gè)密鑰和一個(gè)公鑰構(gòu)成的密鑰對(duì),通過密鑰加密,公鑰解密,或者通過公鑰加密,密鑰解密。其中,公鑰可以公開,密鑰必須保密。
用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í)。
前端加密核心代碼如下:
前端將用到j(luò)sencrypt對(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è)賮砜匆豢辞岸苏?qǐng)求的密碼信息:
這樣一串字符,即便被他人獲取,如果沒有密鑰,在一定程度上,他是無法知道你的密碼的。
當(dāng)然,關(guān)于網(wǎng)絡(luò)安全是一個(gè)大話題,本篇只是對(duì)其中的一小部分進(jìn)行介紹,歡迎留言討論,希望對(duì)您有幫助。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97803.html
摘要:有鑒于此,本文以未安裝工具軟件的計(jì)算機(jī)未激活的愛智設(shè)備為例,實(shí)戰(zhàn)解說零基礎(chǔ)小白的愛智開發(fā)過程。愛智設(shè)備斷開互聯(lián)網(wǎng)也可以運(yùn)行,但本文中的開發(fā)部署等功能無法操作。 【本...
摘要:在比原鏈主網(wǎng)中,在獲取交易和區(qū)塊頭等摘要的過程中使用的哈希算法是算法,而在國(guó)密測(cè)試網(wǎng)中,使用算法替代。啟動(dòng)的是國(guó)密測(cè)試網(wǎng)。可以說,比原鏈的項(xiàng)目進(jìn)展伴隨著國(guó)密測(cè)試網(wǎng)的發(fā)布更上一層樓。 比原項(xiàng)目倉(cāng)庫(kù): Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 國(guó)密算法是指國(guó)家密碼管理局制...
閱讀 1600·2021-09-30 09:47
閱讀 3590·2021-09-22 15:05
閱讀 2835·2021-08-30 09:44
閱讀 3620·2019-08-30 15:55
閱讀 1370·2019-08-30 13:08
閱讀 1325·2019-08-29 16:40
閱讀 549·2019-08-29 12:45
閱讀 1385·2019-08-29 11:25