成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

node中的密碼安全

Wildcard / 926人閱讀

摘要:后端解密后端核心代碼注意要放在處理路由前不加會報錯解密注意這里的常量值要設(shè)置為加密輸入到數(shù)據(jù)庫中的密碼是存入數(shù)據(jù)庫中這里,我是用自帶模塊進行解密,當然,你也可以用的方法進行解密。

本文將講解對于前后端分離的項目,前端注冊或登錄時如何保證用戶密碼安全傳輸?shù)絪erver端,最終存入數(shù)據(jù)庫
為什么需要加密

加密真的有必要嗎?
我們先來看一看前端發(fā)起的ajax請求中,如果不對密碼進行加密,會發(fā)生什么。
f12打開chrome開發(fā)者工具,找到請求,查看請求參數(shù)如下:

如果你的協(xié)議是http,那么前端傳給后端的密碼差不多是裸奔狀態(tài),因為http傳輸?shù)氖敲魑?,很可能在傳輸過程中被竊聽,偽裝或篡改。
那么,弄個https不就好了嗎?
https的確能夠極大增加網(wǎng)站的安全性,但是用https得先買證書(也有免費的),對于個人站點或者不想弄證書的情況下,那最起碼也得對用戶密碼進行一下加密吧。

流程圖

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

生成RSA公鑰和密鑰

既然選擇RSA加密,那么首先得有工具啊,常見的有openssl,但這里不介紹,感興趣的請自行查閱,對于node而言,我介紹一個不錯的庫Node-RSA,我們將用它來生成RSA公鑰和密鑰。

RSA是一種非對稱加密算法,即由一個密鑰和一個公鑰構(gòu)成的密鑰對,通過密鑰加密,公鑰解密,或者通過公鑰加密,密鑰解密。其中,公鑰可以公開,密鑰必須保密

用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)該隔一段時間換一次,比如每次服務(wù)器重啟時。

前端加密

核心代碼如下:

  
  
  

前端將用到j(luò)sencrypt對其進行加密,詳細用法請參考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 // 注意這里的常量值要設(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ù)庫中的密碼是: ", password)
      // 存入數(shù)據(jù)庫中
      // store to db...
      res.end("reg ok")
      break
  }
})

app.listen(3000, "127.0.0.1")

這里,我是用node自帶模塊crpto進行解密,當然,你也可以用Node-RSA的方法進行解密。

最后

我們再來看一看前端請求的密碼信息:

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/97803.html

相關(guān)文章

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

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

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

    摘要:在比原鏈主網(wǎng)中,在獲取交易和區(qū)塊頭等摘要的過程中使用的哈希算法是算法,而在國密測試網(wǎng)中,使用算法替代。啟動的是國密測試網(wǎng)。可以說,比原鏈的項目進展伴隨著國密測試網(wǎng)的發(fā)布更上一層樓。 比原項目倉庫: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 國密算法是指國家密碼管理局制...

    王巖威 評論0 收藏0

發(fā)表評論

0條評論

Wildcard

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<