真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在node中對(duì)密碼進(jìn)行加密-創(chuàng)新互聯(lián)

本篇文章為大家展示了怎么在node中對(duì)密碼進(jìn)行加密,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出沁源免費(fèi)做網(wǎng)站回饋大家。

為什么需要加密

加密真的有必要嗎?

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

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

怎么在node中對(duì)密碼進(jìn)行加密

如果你的協(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ì)用戶密碼進(jìn)行一下加密吧。

流程圖

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

怎么在node中對(duì)密碼進(jìn)行加密

生成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í)行完成后,我們將在根目錄下得到公鑰和私鑰文件:

怎么在node中對(duì)密碼進(jìn)行加密

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

怎么在node中對(duì)密碼進(jìn)行加密

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

上述內(nèi)容就是怎么在node中對(duì)密碼進(jìn)行加密,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站題目:怎么在node中對(duì)密碼進(jìn)行加密-創(chuàng)新互聯(lián)
文章源于:http://weahome.cn/article/digpoc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部