1.前言(老司機直接跳過) 為什么js需要加密
談到加密,大多數人應用場景都在于后端接口的加密簽名校驗。這種一般都用于服務端與服務端之間的相互調用,避免第三方使用你的接口做違法違規的事情,這種加密校驗比較安全,因為沒有暴露在外的代碼。
但是前端運行的JavaScript代碼不一樣,它是運行在瀏覽器的一種輕量級即時編譯型的腳本語言。它是直接運行在用戶電腦上的代碼,除了在sojson.v6加密過的js代碼,普通的js代碼對于使用者來說是公開透明的,對于想要非法獲取你的數據的人也是公開透明的,那么對于那些想要通過分析你的js代碼來盜取你服務器數據的人來說,就是一件十分簡單沒難度的事情。
2.常用的js加密有哪些
JavaScript的原生函數escape()和unescape()
var code = 'console.log("hello")';
var en = escape(code); // console.log%28%22hello%22%29
var de = unescape(en); // console.log("hello")
document.write(en, ' ', de)
用escape函數加密后,字符變成了%開頭形式的特殊編碼。
我們也可以用unescape把加密后的js解密回來
md5
https://github.com/blueimp/JavaScript-MD5
var hash = md5('value') // "2063c1608d6e0baf80249c42e2be5804"
MD5算法的原理可簡要的敘述為:MD5碼以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯后將生成一個128位散列值。
md5加密一般用于確保文件和代碼的唯一性,可以根據計算代碼的md5值來判斷代碼是否被改變。
des/aes
https://github.com/brix/crypto-js
DES是一種使用密鑰加密的塊算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),并授權在非密級政府通信中使用
1. 在utils/common.js中 寫入公用的方法
eg:
// 公用方法
import CryptoJS from "../common/crypto-js/crypto-js.js" // 加密
// 在main.js中引入
export default {
// 加密
encryptByDES(message, key) {
const keyHex = CryptoJS.enc.Utf8.parse(key);
const encrypted = CryptoJS.DES.encrypt(message, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
}
}
2. 在main.js中引入
import commonFun from './utils/common.js'
//在 vue 的原型鏈 (prototype) 中注冊
Vue.prototype.$commonFun = commonFun
3. 頁面中使用
this.$commonFun.encryptByDES(參數1, 參數2);
//參數1:需要加密的數據
//參數2:加密key
rsa
https://github.com/rzcoder/node-rsa
RSA是被研究得最廣泛的公鑰算法,從提出到現在已近三十年,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。
const NodeRSA = require('node-rsa');
const key = new NodeRSA({b: 512});
const text = 'Hello RSA!';
const encrypted = key.encrypt(text, 'base64');
console.log('encrypted: ', encrypted);
const decrypted = key.decrypt(encrypted, 'utf8');
console.log('decrypted: ', decrypted);
base64
Base64是網絡上最常見的用于傳輸8Bit字節碼的編碼方式之一,Base64就是一種基于64個可打印字符來表示二進制數據的方法
瀏覽器的window對象默認就有base64的加解密函數
const code = '(function(){ alert(\'hello\') }())'
const en = window.btoa(code); // 加密
const de = window.atob(en); // 解密
sha1
https://github.com/emn178/js-sha1
SHA1是一種密碼散列函數,美國國家安全局設計,并由美國國家標準技術研究所(NIST)發布為聯邦數據處理標準(FIPS)。SHA-1可以生成一個被稱為消息摘要的160位(20字節)散列值,散列值通常的呈現形式為40個十六進制數。
sha1('Message to hash');
var hash = sha1.create();
hash.update('Message to hash');
hash.hex();
sha256
https://github.com/emn178/js-sha256
SHA256是一種散列函數算法標準,由美國國家安全局研發,由美國國家標準與技術研究院(NIST)在2001年發布,屬于SHA算法之一。和SHA1屬于不同算法標準
sha256('Message to hash');
sha224('Message to hash');
var hash = sha256.create();
hash.update('Message to hash');
hash.hex();
var hash2 = sha256.update('Message to hash');
hash2.update('Message2 to hash');
hash2.array();
// HMAC
sha256.hmac('key', 'Message to hash');
sha224.hmac('key', 'Message to hash');
var hash = sha256.hmac.create('key');
hash.update('Message to hash');
hash.hex();
var hash2 = sha256.hmac.update('key', 'Message to hash');
hash2.update('Message2 to hash');
hash2.array();
如果覺得上邊這些加密方式還不夠安全,無法達到你的預期,可以使用sojson.v6加密,加密強度在國內排名第一,作者每年都會更新加密算法,不停增加加密強度,既保證了js的運行速度又保證了js的安全性。