国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

node中的密碼安全

Wildcard / 923人閱讀

摘要:后端解密后端核心代碼注意要放在處理路由前不加會(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公鑰和密鑰

既然選擇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

相關(guān)文章

  • 2021愛智先行者—(2)零基礎(chǔ)APP開發(fā)實(shí)例

    摘要:有鑒于此,本文以未安裝工具軟件的計(jì)算機(jī)未激活的愛智設(shè)備為例,實(shí)戰(zhàn)解說零基礎(chǔ)小白的愛智開發(fā)過程。愛智設(shè)備斷開互聯(lián)網(wǎng)也可以運(yùn)行,但本文中的開發(fā)部署等功能無法操作。 【本...

    paney129 評(píng)論0 收藏0
  • Bytom國(guó)密網(wǎng)說明和指南

    摘要:在比原鏈主網(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ó)家密碼管理局制...

    王巖威 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<