H5常見的加解密方式

本文總結(jié)項(xiàng)目中用到加解密方式封豪,MD5佛点、RSA、M2/M4挂洛、RES礼预、AES/DES

1.base64加解密 base64的github地址

var str = "hello";
var str64 = window.btoa("hello");
console.log("字符串是:"+str);
console.log("經(jīng)base64編碼后:"+str64);
console.log("base64解碼后:"+window.atob(str64))
base64加解密

2. MD5加密(不可逆) MD5加密的github地址

關(guān)于MD5:
MD5.js是通過前臺(tái)js加密的方式對(duì)用戶信息、密碼等私密信息進(jìn)行加密處理的工具虏劲,也可稱為插件托酸。

MD5共有6種加密方法:
1. hex_md5(value)
2. b64_md5(value)
3. str_md5(value)
4. hex_hmac_md5(key, data)
5. b64_hmac_md5(key, data)
6. str_hmac_md5(key, data)
  //下載好了用script 標(biāo)簽引入使用
  <script src="md5/md5.js"></script>"></script>
  <script>
        var code = "123456";
        var username = "123456";
        var password = "123456";
        var str1 = hex_md5("123456");
        var str2 = b64_md5("123456");
        var str3 = str_md5("123456");
        var str4 = hex_hmac_md5(code,code);
        var str5 = b64_hmac_md5(username,username);
        var str6 = str_hmac_md5(password,password);
        console.log(str1);            // e10adc3949ba59abbe56e057f20f883e
        console.log(str2);            // 4QrcOUm6Wau+VuBX8g+IPg
        console.log(str3);            // áü9IoY??VàWò??>
        console.log(str4);            // 30ce71a73bdd908c3955a90e8f7429ef
        console.log(str5);            // MM5xpzvdkIw5VakOj3Qp7w
        console.log(str6);            // 0?q§;Y??9U???t)?
</script>

3.sha1加密(不可逆)sha1的github地址

<script src="https://cdn.bootcss.com/js-sha1/0.6.0/sha1.js"></script>
<script type="text/javascript">
        var sha1_1 = sha1("mosquito~");
        console.log(sha1_1);
        var sha1_2 = sha1("admin:1001");
        console.log(sha1_2);
</script>
sha1加密

4.編碼和解碼字符串

使用JS函數(shù)的escape()和unescape()褒颈,分別是編碼和解碼字符串

<script type="text/javascript">
      var escape1 =escape("我的名字是:mosquito~");//編碼
      console.log(escape1);
      var unescape1 = unescape(escape1); //解碼
      console.log(unescape1);
</script>  
編碼和解碼字符串

RSA

使用rsa對(duì)大段接口參數(shù)進(jìn)行加解密會(huì)大大降低接口請(qǐng)求及回調(diào)速度,不建議使用励堡,推薦使用AES非對(duì)稱加解密

1.安裝依賴
npm install jsencrypt --save-dev
2.在項(xiàng)目中新建RSA.js谷丸,用來存放公共加解密方法

import JSEncrypt from 'jsencrypt';

//加密
export function encryptedData(publicKey, data) {
    // 新建JSEncrypt對(duì)象
    let encryptor = new JSEncrypt();
    // 設(shè)置公鑰
    encryptor.setPublicKey(publicKey);
    // 加密數(shù)據(jù)
    return encryptor.encrypt(data);
}
//解密
export function decryptedData(privateKey, data) {
    // 新建JSEncrypt對(duì)象
    let encryptor = new JSEncrypt();
    // 設(shè)置公鑰
    encryptor.setPrivateKey(privateKey)
    // 加密數(shù)據(jù)
    return encryptor.decrypt(data);
}

3.引入與調(diào)用

import {encryptedData, decryptedData} from '@/common/RSA.js'
const publicKey ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCH6fhSFH";

//加密
 let product_password = encryptedData(publicKey,"123123");
 console.log(product_password);
   

AES/DES crypto-js.js

推薦AES,AES的密鑰長度比DES大,加密安全系數(shù)較高;AES對(duì)內(nèi)存的需求非常低应结,運(yùn)算速度快刨疼,性能更好

1.安裝依賴
npm install crypto-js --save-dev
2公共文件下創(chuàng)建js,引入依賴并封裝加解密方法

AES.js

import CryptoJS from 'crypto-js';
export default {
    //隨機(jī)生成指定數(shù)量的16進(jìn)制key
    generatekey(num) {
        let library = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        let key = "";
        for (var i = 0; i < num; i++) {
            let randomPoz = Math.floor(Math.random() * library.length);
            key += library.substring(randomPoz, randomPoz + 1);
        }
        return key;
    },
    //AES加密
    encrypt(word, keyStr) {
        keyStr = keyStr ? keyStr : 'abcdsxyzhkj12345'; //判斷是否存在ksy鹅龄,不存在就用定義好的key
        var key = CryptoJS.enc.Utf8.parse(keyStr);
        var srcs = CryptoJS.enc.Utf8.parse(word);
        var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
        return encrypted.toString();
    },
    //AES解密
    decrypt(word, keyStr) {
        keyStr = keyStr ? keyStr : 'abcdsxyzhkj12345';
        var key = CryptoJS.enc.Utf8.parse(keyStr);   // 解密的時(shí)候 必須使用utf8的格式
        var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
        return CryptoJS.enc.Utf8.stringify(decrypt).toString();
    }
}

DES.js

import cryptoJs from 'crypto-js';
 
//隨機(jī)生成指定數(shù)量的16進(jìn)制key
export const generatekey = (num) => {
    let library = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    let key = "";
    for (var i = 0; i < num; i++) {
        let randomPoz = Math.floor(Math.random() * library.length);
        key += library.substring(randomPoz, randomPoz + 1);
    }
    return key;
}
//DES加密
export const encryptDes = (message, key) => {
    var keyHex = cryptoJs.enc.Utf8.parse(key)
    var option = { mode: cryptoJs.mode.ECB, padding: cryptoJs.pad.Pkcs7 }
    var encrypted = cryptoJs.DES.encrypt(message, keyHex, option)
    return encrypted.ciphertext.toString()
}
//DES解密
export const decryptDes = (message, key) => {
    var keyHex = cryptoJs.enc.Utf8.parse(key)
    var decrypted = cryptoJs.DES.decrypt(
        {
            ciphertext: cryptoJs.enc.Hex.parse(message)
        },
        keyHex,
        {
            mode: cryptoJs.mode.ECB,
            padding: cryptoJs.pad.Pkcs7
        }
    )
    return decrypted.toString(cryptoJs.enc.Utf8)
}

3.引入與調(diào)用
AES

import AES from "@/common/AES.js";
var keys = AES.generatekey(16);  ////秘鑰必須為:8/16/32位
//如果是對(duì)象/數(shù)組的話揩慕,需要先JSON.stringify轉(zhuǎn)換成字符串
var encrypts = AES.encrypt(JSON.stringify(cars),keys);
var dess = JSON.parse(AES.decrypt(encrypts,keys));
// var encrypts = that.$encrypt('1234asdasd',keys);
// var dess = that.$decrypt(encrypts,keys);
console.log(encrypts)
console.log(encrypts.length)
console.log(dess)

DES

import { encryptDes, decryptDes,generatekey } from '@/common/DES.js'
 var keys = generatekey(16);
//如果是對(duì)象/數(shù)組的話,需要先JSON.stringify轉(zhuǎn)換成字符串
var encrypts = encryptDes(JSON.stringify(cars),keys);
var dess = JSON.parse(decryptDes(encrypts,keys));
// var encrypts = that.$encrypt('1234asdasd',keys);
// var dess = that.$decrypt(encrypts,keys);
console.log(encrypts)
console.log(encrypts.length)
console.log(dess)

國密sm2扮休,sm3迎卤,sm4加解密

國密算法是國家密碼局制定標(biāo)準(zhǔn)的一系列算法,主要有SM1玷坠,SM2蜗搔,SM3,SM4八堡,密鑰長度和分組長度均為128位樟凄。其中

  • SM1 為對(duì)稱加密。其加密強(qiáng)度與AES相當(dāng)秕重。該算法不公開不同,調(diào)用該算法時(shí),需要通過加密芯片的接口進(jìn)行調(diào)用溶耘。
  • SM2為非對(duì)稱加密二拐,基于ECC。該算法已公開凳兵。由于該算法基于ECC百新,故其簽名速度與秘鑰生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一種)安全強(qiáng)度比RSA 2048位高庐扫,但運(yùn)算速度快于RSA饭望。
  • SM3 消息摘要⌒瓮ィ可以用MD5作為對(duì)比理解铅辞。該算法已公開。校驗(yàn)結(jié)果為256位萨醒。
  • SM4 無線局域網(wǎng)標(biāo)準(zhǔn)的分組數(shù)據(jù)算法斟珊。對(duì)稱加密,密鑰長度和分組長度均為128位富纸。
    sm-crypto可以在微信小程序中實(shí)現(xiàn)SM2囤踩、SM3旨椒、SM4國密算法
國密2

國密需2要用到的依賴
npm install --save sm-crypto

//引入
const sm2 = require('sm-crypto').sm2;
const cipherMode = 1; // 1 - C1C3C2,0 - C1C2C3堵漱,默認(rèn)為1
//切記如果選用的了C1C2C3的加密方式時(shí)是在加密后的密文前面需要加04的
let msgString="wonders"; //要加密的字符串
let publicKey="04813d4d97ad31bd9d18d785f337f683233099d5abed09cb397152d50ac28cc0ba43711960e811d90453db5f5a9518d660858a8d0c57e359a8bf83427760ebcbba" ///公鑰综慎,16進(jìn)制格式,由后端生成
 //加解密
let encryptData = sm2.doEncrypt(msgString, publicKey, cipherMode); // 生成密文勤庐,每次生成都會(huì)不同
let decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode); // 解密結(jié)果

國密4
國密需4要用到的依賴
npm install --save gm-crypt

const SM4 = require("gm-crypt").sm4;
let sm4Config = {
    //配置sm4參數(shù)
    key: "HENG1AN2WEN3YIN4", //這里這個(gè)key值是跟后端要的 16/128位
    mode: "ecb", // 加密的方式有兩種示惊,ecb和cbc兩種,也是看后端如何定義的埃元,不過要是cbc的話下面還要加一個(gè)iv的參數(shù)涝涤,ecb不用
    cipherType: "base64", //
 };
 let sm4 = new SM4(sm4Config); //這里new一個(gè)函數(shù),將上面的sm4Config作為參數(shù)傳遞進(jìn)去岛杀。然后就可以開心的加密了
 let newPassword ="wonders"; //要加密的字符
 let Password = sm4.encrypt(newPassword); //密碼加密     
}

ECB:是一種基礎(chǔ)的加密方式,密文被分割成分組長度相等的塊(不足補(bǔ)齊)崭孤,然后單獨(dú)一個(gè)個(gè)加密类嗤,一個(gè)個(gè)輸出組成密文。
CBC:是一種循環(huán)模式(鏈?zhǔn)剑┍娉瑁耙粋€(gè)分組的密文和當(dāng)前分組的明文操作后再加密遗锣,這樣做的目的是增強(qiáng)破解難度。(不容易主動(dòng)攻擊嗤形,安全性好于ECB精偿,是SSL、IPSec的標(biāo)準(zhǔn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赋兵,一起剝皮案震驚了整個(gè)濱河市笔咽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霹期,老刑警劉巖叶组,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異历造,居然都是意外死亡甩十,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門吭产,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侣监,“玉大人,你說我怎么就攤上這事臣淤¢厦梗” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵荒典,是天一觀的道長酪劫。 經(jīng)常有香客問我吞鸭,道長,這世上最難降的妖魔是什么覆糟? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任刻剥,我火速辦了婚禮,結(jié)果婚禮上滩字,老公的妹妹穿的比我還像新娘造虏。我一直安慰自己,他們只是感情好麦箍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布漓藕。 她就那樣靜靜地躺著,像睡著了一般挟裂。 火紅的嫁衣襯著肌膚如雪享钞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天诀蓉,我揣著相機(jī)與錄音栗竖,去河邊找鬼。 笑死渠啤,一個(gè)胖子當(dāng)著我的面吹牛狐肢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沥曹,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼份名,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了妓美?” 一聲冷哼從身側(cè)響起僵腺,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎部脚,沒想到半個(gè)月后想邦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡委刘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年丧没,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锡移。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呕童,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淆珊,到底是詐尸還是另有隱情夺饲,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站往声,受9級(jí)特大地震影響擂找,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浩销,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一贯涎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慢洋,春花似錦塘雳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至太防,卻和暖如春妻顶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜒车。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工盈包, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人醇王。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像崭添,于是被迫代替她去往敵國和親寓娩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 概述 ? 密碼學(xué)是研究如何保護(hù)信息安全性的一門科學(xué)呼渣,涉及數(shù)學(xué)棘伴、物理、計(jì)算機(jī)屁置、信息論焊夸、編碼學(xué)、通訊技術(shù)等學(xué)科,已經(jīng)在...
    卿酌南燭_b805閱讀 1,617評(píng)論 0 0
  • 常見的加密算法介紹: DES:對(duì)稱加密,加密和解密用同一個(gè)秘鑰款熬。 AES:對(duì)稱加密涌穆,加密和解密用同一個(gè)秘鑰,是下一...
    泡芙coder閱讀 1,106評(píng)論 0 0
  • 1 引言物聯(lián)網(wǎng)是指物品通過各種信息傳感設(shè)備,如射頻識(shí)別说敏、紅外感應(yīng)器、全球定位系統(tǒng)、激光掃描器等信息傳感設(shè)備...
    多森老師閱讀 3,946評(píng)論 0 2
  • 國密即國家密碼局認(rèn)定的國產(chǎn)密碼算法鲁僚。主要有SM1,SM2,SM3冰沙,SM4侨艾。密鑰長度和分組長度均為128位。 SM1...
    袋熊飼養(yǎng)員閱讀 11,935評(píng)論 0 0
  • 這篇文章主要介紹如下幾種加密方式: base64 md5 AES RSA 在示例代碼里面拓挥,沒有專門寫工具類唠梨,而是直...
    六度Space閱讀 2,558評(píng)論 0 9