摘要:后端解密后端核心代碼注意要放在處理路由前不加會報錯解密注意這里的常量值要設置為加密輸入到數據庫中的密碼是存入數據庫中這里,我是用自帶模塊進行解密,當然,你也可以用的方法進行解密。
本文將講解對于前后端分離的項目,前端注冊或登錄時如何保證用戶密碼安全傳輸到server端,最終存入數據庫為什么需要加密
加密真的有必要嗎?
我們先來看一看前端發起的ajax請求中,如果不對密碼進行加密,會發生什么。
f12打開chrome開發者工具,找到請求,查看請求參數如下:
如果你的協議是http,那么前端傳給后端的密碼差不多是裸奔狀態,因為http傳輸的是明文,很可能在傳輸過程中被竊聽,偽裝或篡改。
那么,弄個https不就好了嗎?
https的確能夠極大增加網站的安全性,但是用https得先買證書(也有免費的),對于個人站點或者不想弄證書的情況下,那最起碼也得對用戶密碼進行一下加密吧。
先看一下大體流程圖,首先,我們用工具生成公鑰和私鑰,將其放入server端,前端發起請求獲取公鑰,拿到公鑰后對密碼進行加密,然后將加密后的密碼發送到server端,server端將用密鑰解密,最后再用sha1加密密碼,存入數據庫。
既然選擇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端的公鑰和密鑰應該隔一段時間換一次,比如每次服務器重啟時。
前端加密核心代碼如下:
前端將用到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的方法進行解密。
最后我們再來看一看前端請求的密碼信息:
這樣一串字符,即便被他人獲取,如果沒有密鑰,在一定程度上,他是無法知道你的密碼的。
當然,關于網絡安全是一個大話題,本篇只是對其中的一小部分進行介紹,歡迎留言討論,希望對您有幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/97803.html
摘要:有鑒于此,本文以未安裝工具軟件的計算機未激活的愛智設備為例,實戰解說零基礎小白的愛智開發過程。愛智設備斷開互聯網也可以運行,但本文中的開發部署等功能無法操作。 【本...
摘要:在比原鏈主網中,在獲取交易和區塊頭等摘要的過程中使用的哈希算法是算法,而在國密測試網中,使用算法替代。啟動的是國密測試網。可以說,比原鏈的項目進展伴隨著國密測試網的發布更上一層樓。 比原項目倉庫: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 國密算法是指國家密碼管理局制...
閱讀 1602·2021-09-30 09:47
閱讀 3598·2021-09-22 15:05
閱讀 2840·2021-08-30 09:44
閱讀 3624·2019-08-30 15:55
閱讀 1373·2019-08-30 13:08
閱讀 1330·2019-08-29 16:40
閱讀 553·2019-08-29 12:45
閱讀 1390·2019-08-29 11:25