<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        node中的密碼安全(加密)

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:07:31
        文檔

        node中的密碼安全(加密)

        node中的密碼安全(加密):本文將講解對(duì)于前后端分離的項(xiàng)目,前端注冊(cè)或登錄時(shí)如何保證用戶密碼安全傳輸?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)
        推薦度:
        導(dǎo)讀node中的密碼安全(加密):本文將講解對(duì)于前后端分離的項(xiàng)目,前端注冊(cè)或登錄時(shí)如何保證用戶密碼安全傳輸?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)

        本文將講解對(duì)于前后端分離的項(xiàng)目,前端注冊(cè)或登錄時(shí)如何保證用戶密碼安全傳輸?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得先買證書(shū)(也有免費(fèi)的),對(duì)于個(gè)人站點(diǎn)或者不想弄證書(shū)的情況下,那最起碼也得對(duì)用戶密碼進(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ì)稱加密算法,即由一個(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>

        前端將用到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è)賮?lái)看一看前端請(qǐng)求的密碼信息:

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

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

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        node中的密碼安全(加密)

        node中的密碼安全(加密):本文將講解對(duì)于前后端分離的項(xiàng)目,前端注冊(cè)或登錄時(shí)如何保證用戶密碼安全傳輸?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)
        推薦度:
        標(biāo)簽: 加密 的密碼 里面
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 成人精品国产亚洲欧洲| 亚洲hairy多毛pics大全| 亚洲高清国产拍精品26U| 午夜亚洲AV日韩AV无码大全| 亚洲人成电影在线观看网| 亚洲精华液一二三产区| 在线观看免费宅男视频| 亚洲色婷婷综合开心网| 亚洲精品美女在线观看播放| 日韩精品亚洲专区在线影视| 成人永久免费福利视频网站| 亚洲免费视频网站| 黄网站色视频免费看无下截 | 全免费a级毛片免费**视频| 亚洲中文字幕无码爆乳av中文| 日本激情猛烈在线看免费观看 | 免费国产美女爽到喷出水来视频| 亚洲视频精品在线| 91精品免费不卡在线观看| 免费国产成人高清视频网站| 黄色免费网址在线观看| 亚洲日韩欧洲乱码AV夜夜摸| 亚洲国产午夜精品理论片在线播放| 日本久久久免费高清| 国产精品视频全国免费观看 | 无码人妻一区二区三区免费视频 | 亚洲精品在线播放视频| 在线观看人成视频免费| 美女被羞羞网站免费下载| 亚洲日韩精品射精日| 香蕉97超级碰碰碰免费公| 亚洲AV福利天堂一区二区三| 国产精品1024永久免费视频| 亚洲国产精品免费视频| 成年女人18级毛片毛片免费观看| 亚洲高清中文字幕| 久草免费福利视频| 国产成人亚洲精品狼色在线| 一级毛片免费在线| 免费大片黄手机在线观看| 久久久高清日本道免费观看|