1.前言(老司機(jī)直接跳過) 為什么js需要加密
談到加密,大多數(shù)人應(yīng)用場(chǎng)景都在于后端接口的加密簽名校驗(yàn)。這種一般都用于服務(wù)端與服務(wù)端之間的相互調(diào)用,避免第三方使用你的接口做違法違規(guī)的事情,這種加密校驗(yàn)比較安全,因?yàn)闆]有暴露在外的代碼。
但是前端運(yùn)行的JavaScript代碼不一樣,它是運(yùn)行在瀏覽器的一種輕量級(jí)即時(shí)編譯型的腳本語言。它是直接運(yùn)行在用戶電腦上的代碼,除了在sojson.v6加密過的js代碼,普通的js代碼對(duì)于使用者來說是公開透明的,對(duì)于想要非法獲取你的數(shù)據(jù)的人也是公開透明的,那么對(duì)于那些想要通過分析你的js代碼來盜取你服務(wù)器數(shù)據(jù)的人來說,就是一件十分簡(jiǎn)單沒難度的事情。
2.常用的js加密有哪些
JavaScript的原生函數(shù)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函數(shù)加密后,字符變成了%開頭形式的特殊編碼。
我們也可以用unescape把加密后的js解密回來
md5
https://github.com/blueimp/JavaScript-MD5
var hash = md5('value') // "2063c1608d6e0baf80249c42e2be5804"
MD5算法的原理可簡(jiǎn)要的敘述為:MD5碼以512位分組來處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個(gè)32位分組組成,將這四個(gè)32位分組級(jí)聯(lián)后將生成一個(gè)128位散列值。
md5加密一般用于確保文件和代碼的唯一性,可以根據(jù)計(jì)算代碼的md5值來判斷代碼是否被改變。
des/aes
https://github.com/brix/crypto-js
DES是一種使用密鑰加密的塊算法,1977年被美國(guó)聯(lián)邦政府的國(guó)家標(biāo)準(zhǔn)局確定為聯(lián)邦資料處理標(biāo)準(zhǔn)(FIPS),并授權(quán)在非密級(jí)政府通信中使用
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) 中注冊(cè)
Vue.prototype.$commonFun = commonFun
3. 頁面中使用
this.$commonFun.encryptByDES(參數(shù)1, 參數(shù)2);
//參數(shù)1:需要加密的數(shù)據(jù)
//參數(shù)2:加密key
rsa
https://github.com/rzcoder/node-rsa
RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)在已近三十年,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。
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是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法
瀏覽器的window對(duì)象默認(rèn)就有base64的加解密函數(shù)
const code = '(function(){ alert(\'hello\') }())'
const en = window.btoa(code); // 加密
const de = window.atob(en); // 解密
sha1
https://github.com/emn178/js-sha1
SHA1是一種密碼散列函數(shù),美國(guó)國(guó)家安全局設(shè)計(jì),并由美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所(NIST)發(fā)布為聯(lián)邦數(shù)據(jù)處理標(biāo)準(zhǔn)(FIPS)。SHA-1可以生成一個(gè)被稱為消息摘要的160位(20字節(jié))散列值,散列值通常的呈現(xiàn)形式為40個(gè)十六進(jìn)制數(shù)。
sha1('Message to hash');
var hash = sha1.create();
hash.update('Message to hash');
hash.hex();
sha256
https://github.com/emn178/js-sha256
SHA256是一種散列函數(shù)算法標(biāo)準(zhǔn),由美國(guó)國(guó)家安全局研發(fā),由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)在2001年發(fā)布,屬于SHA算法之一。和SHA1屬于不同算法標(biāo)準(zhǔn)
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();
如果覺得上邊這些加密方式還不夠安全,無法達(dá)到你的預(yù)期,可以使用sojson.v6加密,加密強(qiáng)度在國(guó)內(nèi)排名第一,作者每年都會(huì)更新加密算法,不停增加加密強(qiáng)度,既保證了js的運(yùn)行速度又保證了js的安全性。