国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

敏感數據加密方案及實現

安全 數據安全
現在是大數據時代,需要收集大量的個人信息用于統計。一方面它給我們帶來了便利,另一方面一些個人信息數據在無意間被泄露,被非法分子用于推銷和黑色產業。

前言

現在是大數據時代,需要收集大量的個人信息用于統計。一方面它給我們帶來了便利,另一方面一些個人信息數據在無意間被泄露,被非法分子用于推銷和黑色產業。

2018 年 5 月 25 日,歐盟已經強制執行《通用數據保護條例》(General Data Protection Regulation,縮寫作 GDPR)。該條例是歐盟法律中對所有歐盟個人關于數據保護和隱私的規范。這意味著個人數據必須使用假名化或匿名化進行存儲,并且默認使用盡可能最高的隱私設置,以避免數據泄露。

[[348233]]

相信大家也都不想讓自己在外面“裸奔”。所以,作為前端開發人員也應該盡量避免用戶個人數據的明文傳輸,盡可能的降低信息泄露的風險。

看到這里可能有人會說現在都用 HTTPS 了,數據在傳輸過程中是加密的,前端就不需要加密了。其實不然,我可以在你發送 HTTPS 請求之前,通過谷歌插件來捕獲 HTTPS 請求中的個人信息,下面我會為此演示。所以前端數據加密還是很有必要的。

數據泄露方式

1. 中間人攻擊

中間人攻擊是常見的攻擊方式。詳細過程可以參見這里:

https://zh.wikipedia.org/wiki/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB。大概的過程是中間人通過 DNS 欺騙等手段劫持了客戶端與服務端的會話。

客戶端、服務端之間的信息都會經過中間人,中間人可以獲取和轉發兩者的信息。在 HTTP 下,前端數據加密還是避免不了數據泄露,因為中間人可以偽造密鑰。為了避免中間人攻擊,我們一般采用 HTTPS 的形式傳輸。

2. 谷歌插件

HTTPS 雖然可以防止數據在網絡傳輸過程中被劫持,但是在發送 HTTPS 之前,數據還是可以從谷歌插件中泄露出去。

因為谷歌插件可以捕獲 Network 中的所有請求,所以如果某些插件中有惡意的代碼還是可以獲取到用戶信息的,下面為大家演示。

所以光采用 HTTPS,一些敏感信息如果還是以明文的形式傳輸的話,也是不安全的。如果在 HTTPS 的基礎上再進行數據的加密,那相對來說就更好了。

加密算法介紹

1. 對稱加密

對稱加密算法,又稱為共享密鑰加密算法。在對稱加密算法中,使用的密鑰只有一個,發送和接收雙方都使用這個密鑰對數據進行加密和解密。

這就要求加密和解密方事先都必須知道加密的密鑰。其優點是算法公開、計算量小、加密速度快、加密效率高;缺點是密鑰泄露之后,數據就會被破解。一般不推薦單獨使用。根據實現機制的不同,常見的算法主要有:

  • AES(https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86)
  • ChaCha20 (https://zh.wikipedia.org/wiki/Salsa20#ChaCha20)、3DES (https://zh.wikipedia.org/wiki/3DES)等。

2. 非對稱加密

非對稱加密算法,又稱為公開密鑰加密算法。它需要兩個密鑰,一個稱為公開密鑰 (public key),即公鑰;另一個稱為私有密鑰 (private key),即私鑰。

他倆是配對生成的,就像鑰匙和鎖的關系。因為加密和解密使用的是兩個不同的密鑰,所以這種算法稱為非對稱加密算法。其優點是算法強度復雜、安全性高;缺點是加解密速度沒有對稱加密算法快。常見的算法主要有:

  • RSA (https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95)
  • Elgamal (https://zh.wikipedia.org/wiki/ElGamal%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95)等。

3. 散列算法

散列算法又稱散列函數、哈希函數,是把消息或數據壓縮成摘要,使得數據量變小,將數據的格式固定成特定長度的值。一般用于校驗數據的完整性,平時我們下載文件就可以校驗 MD5 來判斷下載的數據是否完整。常見的算法主要有:

  • MD4 (https://zh.wikipedia.org/wiki/MD4)
  • MD5 (https://zh.wikipedia.org/wiki/MD5)
  • SHA (https://zh.wikipedia.org/wiki/SHA%E5%AE%B6%E6%97%8F) 等。

實現方案

方案一:如果用對稱加密,那么服務端和客戶端都必須知道密鑰才行。那服務端勢必要把密鑰發送給客戶端,這個過程中是不安全的,所以單單用對稱加密行不通。

方案二:如果用非對稱加密,客戶端的數據通過公鑰加密,服務端通過私鑰解密,客戶端發送數據實現加密沒問題。客戶端接受數據,需要服務端用公鑰加密,然后客戶端用私鑰解密。所以這個方案需要兩套公鑰和私鑰,需要在客戶端和服務端各自生成自己的密鑰。

方案三:如果把對稱加密和非對稱加密相結合。客戶端需要生成一個對稱加密的密鑰 1,傳輸內容與該密鑰 1進行對稱加密傳給服務端,并且把密鑰 1 和公鑰進行非對稱加密,然后也傳給服務端。服務端通過私鑰把對稱加密的密鑰 1 解密出來,然后通過該密鑰 1 解密出內容。以上是客戶端到服務端的過程。如果是服務端要發數據到客戶端,就需要把響應數據跟對稱加密的密鑰 1 進行加密,然后客戶端接收到密文,通過客戶端的密鑰 1 進行解密,從而完成加密傳輸。

總結:

以上只是列舉了常見的加密方案。總的來看,方案二比較簡單,但是需要維護兩套公鑰和私鑰,當公鑰變化的時候,必須通知對方,靈活性比較差。方案三相對方案二來說,密鑰 1 隨時可以變化,并且不需要通知服務端,相對來說靈活性、安全性好點并且方案三對內容是對稱加密,當數據量大時,對稱加密的速度會比非對稱加密快。所以本文采用方案三給予代碼實現。

代碼實現

下面是具體的代碼實現(以登錄接口為例),主要的目的就是要把明文的個人信息轉成密文傳輸。其中對稱加密庫使用的是 AES,非對稱加密庫使用的是RSA。

客戶端:

  • AES 庫(aes-js):https://github.com/ricmoo/aes-js
  • RSA庫(jsencrypt):https://github.com/travist/jsencrypt
  • 具體代碼實現登錄接口

(1) 客戶端需要隨機生成一個 aesKey,在頁面加載完的時候需要從服務端請求 publicKey

  1. let aesKey = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; // 隨機產生 
  2. let publicKey = ""; // 公鑰會從服務端獲取 
  3.  
  4. // 頁面加載完之后,就去獲取公鑰 
  5. window.onload = () => { 
  6.   axios({ 
  7.     method: "GET", 
  8.     headers: { "content-type": "application/x-www-form-urlencoded" }, 
  9.     url: "http://localhost:3000/getPub", 
  10.   }) 
  11.     .then(function (result) { 
  12.       publicKey = result.data.data; // 獲取公鑰 
  13.     }) 
  14.     .catch(function (error) { 
  15.       console.log(error); 
  16.     }); 
  17. }; 

2. aes 加密和解密方法

  1. /** 
  2.  * aes加密方法 
  3.  * @param {string} text 待加密的字符串 
  4.  * @param {array} key 加密key 
  5.  */ 
  6. function aesEncrypt(text, key) { 
  7.   const textBytes = aesjs.utils.utf8.toBytes(text); // 把字符串轉換成二進制數據 
  8.  
  9.   // 這邊使用CTR-Counter加密模式,還有其他模式可以選擇,具體可以參考aes加密庫 
  10.   const aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); 
  11.  
  12.   const encryptedBytes = aesCtr.encrypt(textBytes); // 進行加密 
  13.   const encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes); // 把二進制數據轉成十六進制 
  14.  
  15.   return encryptedHex; 
  16.  
  17. /** 
  18.  * aes解密方法 
  19.  * @param {string} encryptedHex 加密的字符串 
  20.  * @param {array} key 加密key 
  21.  */ 
  22. function aesDecrypt(encryptedHex, key) { 
  23.   const encryptedBytes = aesjs.utils.hex.toBytes(encryptedHex); // 把十六進制數據轉成二進制 
  24.   const aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); 
  25.  
  26.   const decryptedBytes = aesCtr.decrypt(encryptedBytes); // 進行解密 
  27.   const decryptedText = aesjs.utils.utf8.fromBytes(decryptedBytes); // 把二進制數據轉成utf-8字符串 
  28.  
  29.   return decryptedText; 

3. 請求登錄

  1. /** 
  2.  * 登陸接口 
  3.  */ 
  4. function submitFn() { 
  5.   const userName = document.querySelector("#userName").value; 
  6.   const password = document.querySelector("#password").value; 
  7.   const data = { 
  8.     userName, 
  9.     password, 
  10.   }; 
  11.  
  12.   const text = JSON.stringify(data); 
  13.   const sendData = aesEncrypt(text, aesKey); // 把要發送的數據轉成字符串進行加密 
  14.   console.log("發送數據", text); 
  15.  
  16.   const encrypt = new JSEncrypt(); 
  17.   encrypt.setPublicKey(publicKey); 
  18.   const encryptencrypted = encrypt.encrypt(aesKey.toString()); // 把aesKey進行非對稱加密 
  19.  
  20.   const url = "http://localhost:3000/login"
  21.   const params = { id: 0, data: { param1: sendData, param2: encrypted } }; 
  22.  
  23.   axios({ 
  24.     method: "POST", 
  25.     headers: { "content-type": "application/x-www-form-urlencoded" }, 
  26.     url: url, 
  27.     data: JSON.stringify(params), 
  28.   }) 
  29.     .then(function (result) { 
  30.       const reciveData = aesDecrypt(result.data.data, aesKey); // 用aesKey進行解密 
  31.       console.log("接收數據", reciveData); 
  32.     }) 
  33.     .catch(function (error) { 
  34.       console.log("error", error); 
  35.     }); 

服務端(Node):

  • AES庫(aes-js):https://github.com/ricmoo/aes-js
  • RSA 庫(node-rsa):https://github.com/rzcoder/node-rsa
  • 具體代碼實現登錄接口

(1) 引用加密庫

  1. const http = require("http"); 
  2. const aesjs = require("aes-js"); 
  3. const NodeRSA = require("node-rsa"); 
  4. const rsaKey = new NodeRSA({ b: 1024 }); // key的size為1024位 
  5. let aesKey = null; // 用于保存客戶端的aesKey 
  6. let privateKey = ""; // 用于保存服務端的公鑰 
  7.  
  8. rsaKey.setOptions({ encryptionScheme: "pkcs1" }); // 設置加密模式 

(2) 實現 login 接口

  1. http 
  2.   .createServer((request, response) => { 
  3.     response.setHeader("Access-Control-Allow-Origin", "*"); 
  4. response.setHeader("Access-Control-Allow-Headers", "Content-Type"); 
  5.     response.setHeader("Content-Type", "application/json"); 
  6. switch (request.method) { 
  7.       case "GET": 
  8.         if (request.url === "/getPub") { 
  9.           const publicKey = rsaKey.exportKey("public"); 
  10.           privateKey = rsaKey.exportKey("private"); 
  11.           response.writeHead(200); 
  12.           response.end(JSON.stringify({ result: true, data: publicKey })); // 把公鑰發送給客戶端 
  13.           return; 
  14.         } 
  15.         break; 
  16.       case "POST": 
  17.         if (request.url === "/login") { 
  18.           let str = ""
  19.           request.on("data", function (chunk) { 
  20.             str += chunk; 
  21.           }); 
  22.           request.on("end", function () { 
  23.             const params = JSON.parse(str); 
  24.             const reciveData = decrypt(params.data); 
  25.             console.log("reciveData", reciveData); 
  26.             // 一系列處理之后 
  27.  
  28.             response.writeHead(200); 
  29.             response.end( 
  30.               JSON.stringify({ 
  31.                 result: true, 
  32.                 data: aesEncrypt( 
  33.                   JSON.stringify({ userId: 123, address: "杭州" }), // 這個數據會被加密 
  34.                   aesKey 
  35.                 ), 
  36.               }) 
  37.             ); 
  38.           }); 
  39.           return; 
  40.         } 
  41.         break; 
  42.       default: 
  43.         break; 
  44.     } 
  45.     response.writeHead(404); 
  46.     response.end(); 
  47.   }) 
  48.   .listen(3000); 

3. 加密和解密方法

  1. function decrypt({ param1, param2 }) { 
  2.   const decrypted = rsaKey.decrypt(param2, "utf8"); // 解密得到aesKey 
  3.   aesKey = decrypted.split(",").map((item) => { 
  4. return +item; 
  5.   }); 
  6.  
  7.   return aesDecrypt(param1, aesKey); 
  8.  
  9. /** 
  10.  * aes解密方法 
  11.  * @param {string} encryptedHex 加密的字符串 
  12.  * @param {array} key 加密key 
  13.  */ 
  14. function aesDecrypt(encryptedHex, key) { 
  15.   const encryptedBytes = aesjs.utils.hex.toBytes(encryptedHex); // 把十六進制轉成二進制數據 
  16.   const aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); // 這邊使用CTR-Counter加密模式,還有其他模式可以選擇,具體可以參考aes加密庫 
  17.  
  18.   const decryptedBytes = aesCtr.decrypt(encryptedBytes); // 進行解密 
  19.   const decryptedText = aesjs.utils.utf8.fromBytes(decryptedBytes); // 把二進制數據轉成字符串 
  20.  
  21.   return decryptedText; 
  22.  
  23. /** 
  24.  * aes加密方法 
  25.  * @param {string} text 待加密的字符串 
  26.  * @param {array} key 加密key 
  27.  */ 
  28. function aesEncrypt(text, key) { 
  29.   const textBytes = aesjs.utils.utf8.toBytes(text); // 把字符串轉成二進制數據 
  30.   const aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); 
  31.  
  32.   const encryptedBytes = aesCtr.encrypt(textBytes); // 加密 
  33.   const encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes); // 把二進制數據轉成十六進制 
  34.  
  35.   return encryptedHex; 

完整的示例代碼:https://github.com/Pulset/FrontDataEncrypt

演示效果

總結

本文主要介紹了一些前端安全方面的知識和具體加密方案的實現。為了保護客戶的隱私數據,不管是 HTTP 還是 HTTPS,都建議密文傳輸信息,讓破解者增加一點攻擊難度吧。當然數據加解密也會帶來一定性能上的消耗,這個需要各位開發者各自衡量了。

 

責任編輯:趙寧寧 來源: 政采云前端團隊
相關推薦

2024-01-01 14:19:11

2021-09-16 10:11:15

Dataphin 數據保護

2010-05-14 13:50:57

2024-12-09 08:27:59

敏感數據加密

2010-09-25 08:55:29

2023-10-23 10:39:05

2023-06-06 08:51:06

2023-07-21 12:48:37

2018-04-28 09:00:00

2023-06-27 07:26:36

汽車之家敏感數據治理

2010-06-09 14:47:24

MySQL加密函數

2024-08-08 10:32:11

2023-10-30 15:35:05

數據安全數據驅動

2020-04-16 08:00:00

Ansible Vau敏感數據加密

2024-03-05 09:40:35

2021-10-28 09:42:38

代碼編碼開發

2011-08-01 14:36:06

加密RSA

2010-06-02 16:28:27

MySQL加密函數

2012-04-12 14:45:12

賽門鐵克云南電網

2024-01-01 15:53:25

點贊
收藏

51CTO技術棧公眾號

欧美一区二区黄色| 亚洲国产伊人| 一级片视频免费观看| a√免费观看在线网址www| 亚洲欧洲午夜| 91成人在线视频| 国产精品第一国产精品| 日韩a级大片| 日韩精品中文字| 免费人成在线观看视频播放| 亚州综合一区| 久久精品国产精品| 刘亦菲一区二区三区免费看| 日韩一级成人av| 99青草视频在线播放视| 都市激情亚洲色图| 日本欧洲一区| 亚洲欧洲99久久| 手机看片一级片| 久久天堂av综合合色蜜桃网| 国产女大学生av| 91麻豆精品在线观看| aa视频在线播放| 成人福利视频网站| 免费国产黄色网址| 99精品在线免费| 精品久久久久久久免费人妻| 国产午夜精品久久| 无码精品国产一区二区三区免费| 成人动漫一区二区三区| 国产成人在线免费看| 久久综合久久99| 日韩av卡一卡二| 亚洲欧洲综合另类| 最新中文在线视频| 欧美日韩在线三区| 国产精品剧情一区二区在线观看| 日韩午夜av一区| 欧美第一视频| 裸体女人亚洲精品一区| 欧美日韩一本| 亚洲精品欧美日韩专区| 亚洲欧美日韩精品一区二区 | 欧美videossex| 日韩午夜av电影| 高清av不卡| 蜜臀久久99精品久久久久久宅男| 猫咪成人在线观看| 国产精品日韩欧美综合| 红桃视频亚洲| 可以在线看黄的网站| 国产欧美综合在线观看第十页| 免费白浆视频| 欧美精品18+| 在线成人视屏| 欧美中文字幕在线播放| 最近2019中文字幕在线高清| 成人h动漫在线| 国产日韩欧美a| 国产裸体舞一区二区三区| 99久久精品99国产精品| 日韩暖暖在线视频| 精品国内自产拍在线观看视频| 97色在线视频观看| 激情小说亚洲一区| 蜜桃成人精品| 欧美肥臀大乳一区二区免费视频| 伊人久久综合影院| 国产成人在线亚洲欧美| 日韩欧美中文| 成人免费视频观看视频| 日韩视频中文| 中文字幕色呦呦| 久久精品一区蜜桃臀影院| aaa一级毛片| 欧美性猛交xxxx偷拍洗澡| 麻豆91在线| 中文字幕日韩精品在线观看| 91免费精品国偷自产在线在线| 日本aⅴ大伊香蕉精品视频| 最新国产精品视频| 欧美污视频久久久| 亚洲欧美日韩系列| 96sao精品免费视频观看| 亚洲视频一区二区免费在线观看| 精品国产一区二区三区久久久久久| 亚洲东热激情| 粉嫩虎白女毛片人体| 亚洲人成自拍网站| 成人毛片免费| 成人高潮视频| 亚洲成色www久久网站| 国产精品看片你懂得| 国产精品久久91| 亚洲国产成人在线播放| 亚洲激情综合网| 久久99热这里只有精品| 都市激情久久| 免费网站成人| 亚洲一区二区三| 日本成熟性欧美| 亚洲男人天堂九九视频| 国模大尺度一区二区三区| 国产亚洲福利一区| 欧美sss在线视频| 成人一区二区电影| 99精品视频免费观看视频| 国产欧美精品va在线观看| 国产大片一区| 色噜噜成人av在线| 丁香花电影在线观看完整版| 在线成人私人影院| 一区二区三区我不卡| 欧美亚洲国产另类| 精品国产一区a| 亚洲另类在线制服丝袜| 精品999网站| 波多野结衣在线一区二区| 久草在线视频福利| 国产美女极品在线| 男人操女人免费软件| 国产精品视频午夜| 久久久久久国产精品久久| 日韩电影免费在线观看中文字幕 | 最近免费观看高清韩国日本大全| 91精品国产综合久久精品app| 青青青伊人色综合久久| 福利小视频在线| 2020国产精品极品色在线观看| 影音先锋在线一区| 久久久99久久| 日韩美女视频一区| 国产91久久精品一区二区| 欧美理论在线观看| 日韩电影免费观看高清完整| 亚洲激情自拍偷拍| 色喇叭免费久久综合| 青青草精品视频在线| 亚洲第一中文字幕| 日本在线播放一区二区三区| 欧美激情图区| 中文字幕日韩精品在线观看| 成人av在线影院| free欧美| 日本一区二区三区四区高清视频| 第一福利永久视频精品| 忘忧草精品久久久久久久高清| 在线资源av| 国产精品三区四区| 日韩一区二区在线观看| 麻豆成人综合网| 91国内外精品自在线播放| 国产又大又硬又粗| 欧美资源在线观看| 色美美综合视频| 日韩成人精品视频| 亚洲国产欧美日本视频| 妺妺窝人体色www在线小说| 欧美日韩亚洲综合在线| 日本一区二区免费在线观看视频 | 天天综合网天天做天天受| 一区二区三区回区在观看免费视频| 国产精品1区2区3区在线观看| 欧美美女被草| www99avcom| 豆国产97在线| 日韩精品在线影院| 国产清纯美女被跳蛋高潮一区二区久久w| 亚洲动漫精品| 黄色免费网站在线观看| 成人一区二区免费视频| 国产精品高潮呻吟久久av无限| 欧美日本韩国一区| av资源网一区| 久久理论电影| 欧美xxxhd| 91免费观看国产| 日韩最新在线| 免费大片在线观看www| 无码日本精品xxxxxxxxx| 26uuu日韩精品一区二区| 欧美亚洲一区三区| 成人av综合一区| 欧美一区二区三区久久精品| 高清毛片在线观看| 激情se五月| 99亚洲精品视频| 国产精品日韩在线一区| 亚洲成**性毛茸茸| 亚洲猫色日本管| 国产精品福利影院| 午夜成人影视| 国产一二三四五| 国产精品av在线播放| 日韩成人精品一区| 日韩影院在线观看| 午夜精品久久久久久久99热| 日韩av网站在线| 这里只有精品在线播放| 日韩大陆毛片av|