前端常見的加密算法介紹

在信息安全愈來愈受重視的今天,前端的各類加密也變得更加劇要。一般跟服務器的交互中,爲保障數據傳輸的安全性,避免被人抓包篡改數據,除了 https 的應用,還須要對傳輸數據進行加解密。前端

目前常見的加密算法能夠分紅三類git

  • 對稱加密算法:AES、...
  • 非對稱加密算法:RSA、...
  • Hash 算法:MD五、...

2、對稱加密算法

對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。它要求發送方和接收方在安全通訊以前,商定一個密鑰。對稱算法的安全性依賴於密鑰,泄漏密鑰就意味着任何人均可以對他們發送或接收的消息解密,因此密鑰的保密性對通訊的安全性相當重要。github

特色

  • 優勢:算法公開、計算量小、加密速度快、加密效率高。
  • 缺點:在數據傳送前,發送方和接收方必須商定好密鑰,而後雙方保存好密鑰。若是一方的密鑰被泄露,那麼加密信息也就不安全了
  • 使用場景:本地數據加密、https 通訊、網絡傳輸等

AES

AES:高級加密標準(Advanced Encryption Standard)爲最多見的對稱加密算法(微信小程序加密傳輸就是用這個加密算法的)。算法

image

密鑰:用來加密明文的密碼。密鑰爲接收方與發送方協商產生,但不能夠直接在網絡上傳輸,不然會致使密鑰泄漏,一般是經過非對稱加密算法加密密鑰,而後再經過網絡傳輸給對方,或者直接面對面商量密鑰。密鑰是絕對不能夠泄漏的,不然會被攻擊者還原密文,竊取數據。小程序

在項目中須要用到 AES 加密時,可使用開源的 js 庫:crypto-js微信小程序

var CryptoJS = require('crypto-js');

var data = { id: 1, text: 'Hello World' };

// 加密生成密文
var ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), 'secret_key_123').toString();

// 解密獲得明文
var bytes = CryptoJS.AES.decrypt(ciphertext, 'secret_key_123');
var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));

3、非對稱加密算法

非對稱加密算法須要兩個密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰)。公鑰與私鑰是一對,若是用公鑰對數據進行加密,只有用對應的私鑰才能解密。由於加密和解密使用的是兩個不一樣的密鑰,因此這種算法叫做非對稱加密算法。瀏覽器

特色

  • 優勢:非對稱加密與對稱加密相比其安全性更好
  • 缺點:加密和解密花費時間長、速度慢,只適合對少許數據進行加密。
  • 使用場景:https 會話前期、CA 數字證書、信息加密、登陸認證等

RSA

RSA 加密算法是非對稱加密算法最多見的一種。RSA 是 1977 年由 Ron Rivest、Adi Shamir 和 Leonard Adleman 一塊兒提出的。RSA 就是他們三人姓氏開頭字母拼在一塊兒組成的。安全

image

在項目中須要用到 RSA 加密時,可使用開源的 js 庫:jsencrypt服務器

// 使用公鑰加密
var publicKey = 'public_key_123';
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
var encrypted = encrypt.encrypt('Hello World');

// 使用私鑰解密
var privateKey = 'private_key_123';
var decrypt = new JSEncrypt();
decrypt.setPrivateKey(privateKey);
var uncrypted = decrypt.decrypt(encrypted);

4、Hash 算法

Hash,通常翻譯作「散列」,也有直接音譯爲「哈希」的,就是把任意長度的輸入(又叫作預映射, pre-image),經過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,而不可能從散列值來惟一的肯定輸入值。微信

簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。

特色

  • 優勢:不可逆、易計算、特徵化
  • 缺點:可能存在散列衝突
  • 使用場景:文件或字符串一致性校驗、數字簽名、鑑權協議

MD5

MD5 是比較常見的 Hash 算法,對於 MD5 而言,有兩個特性是很重要的,第一:明文數據通過散列之後的值是定長的;第二:是任意一段明文數據,通過散列之後,其結果必須永遠是不變的。前者的意思是可能存在有兩段明文散列之後獲得相同的結果,後者的意思是若是咱們散列特定的數據,獲得的結果必定是相同的。

好比在登陸時將密碼進行 md5 加密再傳輸給服務器,服務器中的密碼也是用 md5 加密後存儲的,那麼只要驗證加密後的密文是否一致則可。

在項目中須要用到 MD5 加密時,可使用開源的 js 庫:JavaScript-MD5

var hash = md5('Hello World');
// b10a8db164e0754105b7a99be72e3fe5

5、Base64 編碼

Base64 編碼只是一種編碼格式並非加密算法,它可用於在 HTTP 環境下傳遞較長的標識信息。

特色

  • 能夠將任意的二進制數據進行 Base64 編碼
  • 數據加密以後,數據量會變大,變大 1/3 左右
  • 編碼後有個很是顯著的特色,末尾有個=號
  • 可進行反向解碼
  • Base64 編碼具備不可讀性

現代瀏覽器都提供了 Base64 編碼、解碼方法,btoa() 和 atob()

var enc = window.btoa('Hello World');
// SGVsbG8gV29ybGQ=

var str = window.atob(enc);
// Hello World

6、總結

在業務 http 請求中,AES 的密鑰在前端隨機生成,從服務器獲取 RSA 的公鑰,對 AES 的密鑰進行非對稱加密,把加密後的密鑰在請求頭中傳給服務器,用 AES 對 body 進行加密。服務器收到請求頭中的加密後的密鑰,用 RSA 的密鑰進行解密,獲得明文的 AES 密鑰,便可對 body 進行解密。md5 有校驗字符串一致性的特性,爲避免請求被攔截後篡改 body,可在發請求時,將 body 字符串進行一個 md5 加密後在請求頭傳輸,服務器收到請求後,解密 body 後再 md5 與請求頭的進行校驗,可驗證是否請求被篡改。

相關文章
相關標籤/搜索