cbc cryptojs 前后端_前端加密JS库--CryptoJS 使用指南
有时候项目涉及到的敏感数据比较多,为了信息安全,我们常常需要对一些数据进行接口加密处理,如编码、将明文转化为暗文、加密比对、AES + BASE64 算法加密等。
接下来我们就分别说一下 CryptoJS 常用的一些方法。
Base64 编码
为什么要编码?
由于一些网络通讯协议的限制, 又或者是出于信息加密的目的, 我们就需要将原信息转换为base64编码,然后才能进行传输.例如,发送某些含有 ASCII 码表中0到31之间的控制字符的数据。
window.btoa 对字符串进行 base64编码(注意不能编码中文);
winodw.atob 对 base64字符串 进行解码(对于包含中文的 base64编码,不能正确解码);
通常的方法是通过 window.btoa() 方法对源数据进行编码, 然后接收方使用 window.atob() 方法对其进行解码, 从而得到原数据。但是这种方法存在的问题是:window.btoa() 不支持中文, window.atob() 转换含有中文的 base64编码 的时候中文部分会变为乱码。另一个存在的问题是解码github的readme数据的时候也是乱码。经过查找相关资料发现了 Base64的编码与解码转的最优方案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// 编码
function utf8_to_b64(str){
return window.btoa(unescape(encodeURIComponent(str)));
}
// 解码
function b64_to_utf8(str){
return decodeURIComponent(escape(window.atob(str)));
}
// Usage:
utf8_to_b64('✓ à la mode'); // 4pyTIMOgIGxhIG1vZGU=
b64_to_utf8('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"
utf8_to_b64('I \u2661 Unicode!'); // SSDimaEgVW5pY29kZSE=
b64_to_utf8('SSDimaEgVW5pY29kZSE='); // "I ♡ Unicode!"
utf8_to_b64('我爱中国'); // 5oiR54ix5Lit5Zu9
b64_to_utf8('SSDimaEgVW5pY29kZSE='); // "我爱中国"
utf8_to_b64(123456); // MTIzNDU2
b64_to_utf8("MTIzNDU2"); // 123456
AES 加密
安装
1$ npm install crypto-js
aes加密: crypto.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41import CryptoJS from "crypto-js";
const key = CryptoJS.enc.Utf8.parse("1234567890000000"); //16位
const iv = CryptoJS.enc.Utf8.parse("1234567890000000");
export default {
//aes加密
encrypt(word) {
let encrypted = "";
if (typeof word == "string") {
const srcs = CryptoJS.enc.Utf8.parse(word);
encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
} else if (typeof word == "object") {
//对象格式的转成json字符串
const data = JSON.stringify(word);
const srcs = CryptoJS.enc.Utf8.parse(data);
encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
}
return encrypted.ciphertext.toString();
},
// aes解密
decrypt(word) {
const encryptedHexStr = CryptoJS.enc.Hex.parse(word);
const srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
const decrypt = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
};
使用
1
2
3
4
5
6
7
8
9
10
11
12
13import Crypto from "@/utils/crypto";
Crypto.encrypt("✓ à la mode"); // b915bf40c4795227488da86978f55fce
Crypto.decrypt(userPwd); // "✓ à la mode"
Crypto.encrypt("✓ à la mode"); // 6317313288b32bf1909f165ec530d60a
Crypto.decrypt(userPwd); // "I ♡ Unicode!"
Crypto.encrypt("我爱中国"); // 1898a34273855f55255437aa22f87504
Crypto.decrypt(userPwd); // "我爱中国"
Crypto.encrypt("123456"); // dd7a6c4edc68e683b700a7a2846a2bc6
Crypto.decrypt(userPwd); // "123456"
前后端数据通信参数加密
加密代码实现:
项目中需要将所有传到后台的参数分5个步骤处理:
第一步:排序
第二步:将排序好的参数进行MD5加密作为接口的签名
第三步:将排序好的参数和接口签名拼接上进行AES加密
第四部:将AES加密后的密文Base64加密
第五步:将最终的密文encodeURIComponent;
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17function encryption(data){
let strs=[];
for(let i in data){
strs.push(i+'='+data[i]);
}
strs.sort(); // 数组排序
strs=strs.join('&'); // 数组变字符串
let endData=strs+'&sign='+CryptoJS.MD5(strs+'ADfj3kcadc2349akvm1CPFFCD84f').toString(); // MD5加密
let key = CryptoJS.enc.Utf8.parse("0880076B18D7EE81"); // 加密秘钥
let iv = CryptoJS.enc.Utf8.parse("CB3EC842D7C69578"); // 矢量
let encryptResult = CryptoJS.AES.encrypt(endData,key, { // AES加密
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7 // 后台用的是pad.Pkcs5,前台对应为Pkcs7
});
return encodeURIComponent(CryptoJS.enc.Base64.stringify(encryptResult.ciphertext)); // Base64加密encode;
}
加密最终的密文拼接在接口地址后面,请求接口。后台返回的数据也是密文;解密方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14function decryption(data){
let key = CryptoJS.enc.Utf8.parse("0880076B18D7EE81"); // 加密秘钥
let iv = CryptoJS.enc.Utf8.parse("CB3EC842D7C69578"); // 矢量
let baseResult=CryptoJS.enc.Base64.parse(data); // Base64解密
let ciphertext=CryptoJS.enc.Base64.stringify(baseResult); // Base64解密
let decryptResult = CryptoJS.AES.decrypt(ciphertext,key, { // AES解密
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
let resData=decryptResult.toString(CryptoJS.enc.Utf8).toString();
return JSON.parse(resData);
}
备注:因为后台返回的数据是json格式;所以做种return的时候使用JSON.parse();如果解密的目标为字符串,比如说需要解密的是一个加密的token值。那就要做相应的改动:
1
2
3
4
5
6
7
8
9
10
11
12function decryption(data){
let key = CryptoJS.enc.Utf8.parse("0880076B18D7EE81"); // 加密秘钥
let iv = CryptoJS.enc.Utf8.parse("CB3EC842D7C69578"); // 矢量
let baseResult=CryptoJS.enc.Base64.parse(data); // Base64解密
let ciphertext=CryptoJS.enc.Base64.stringify(baseResult); // Base64解密
let decryptResult = CryptoJS.AES.decrypt(ciphertext,key, { // AES解密
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Utf8.stringify(decryptResult);
}
cbc cryptojs 前后端_前端加密JS库--CryptoJS 使用指南相关推荐
- cbc cryptojs 前后端_前端CryptoJS AES/DES加解密与后端PHP AES/DES加解密
本文涉及到的内容有:前端使用CryptoJS对数据进行DES或AES加密解密: 后端使用PHP openssl对数据进行解密和加密. 前端AES加密数据 首先在vue环境下安装crypto-js,cr ...
- java和Vue前后端RSA对称加密
java和Vue前后端RSA对称加密 参考:https://blog.csdn.net/qq_25623257/article/details/109775531 一.生成秘钥对(公私钥) 在线生成地 ...
- 一个Java程序猿眼中的前后端分离以及Vue.js入门
原文:https://mp.weixin.qq.com/s/HWRYAR16vLE1XFep6_i1tA 松哥的书里边,其实有涉及到 Vue,但是并没有详细说过,原因很简单,Vue 的资料都是中文的, ...
- 前后端分离前端部署方案是什么?
这段时间,粉丝朋友会经常问到一个问题,即:前后端分离如何部署?前端部署方案是什么?虽然我们回复了很多次,但是依然有不少朋友有疑问.今天,小编就给大家整理出来,如果对这个问题感兴趣,就可以收藏起来随时查 ...
- WEB前后端交互原型通用元件库、常用组件、信息输出、信息输入、信息反馈、综合系列、页面交互、首页、分类页、内容详情、用户中心、注册登录、找回密码、元件库、web元件库、rplib、axure
WEB前后端交互原型通用元件库.常用组件.信息输出.信息输入.信息反馈.综合系列.页面交互.首页.分类页.内容详情.用户中心.注册登录.找回密码.元件库.web元件库.rplib.axure原型 we ...
- 计算机课程设计-基于ssm+vue的物资管理系统(前后端分离)-物资出库入库管理系统java代码
计算机课程设计-基于ssm+vue的物资管理系统(前后端分离)-物资出库入库管理系统java代码 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 作者:IT跃迁谷 1.开发环境 开发语言:Ja ...
- tomcat vue 不用 前后端_部署前后端分离项目(后端 tomcat 前端 nginx)
关键词 spring-boot gradle 腾讯云 tomcat nginx vue 前后端分离 代理 前言 因为种种原因,把后端部署在 tomcat,前端项目部署在 nginx. Tomcat t ...
- mysql 前端后端_前端开发者学习后端(一) —— mysql 命令
一.我想说 作为一名web前端工程师,也要尝试学习后端知识,从数据库基础开始.下面是一些常用的mysql数据库命令,会持续更新,而且后期会推出koa+mysql的简单实践,在这篇文章之后~_~ 二.创 ...
- [技术讨论]谈架构设计:如何界定前后端,前端是否需要数据库?
[正常]兼职 9:47:11 我问个问题,如何界定前台与后台的功能范围?什么是前台?什么是后台? [惜言]+群 9:47:39 我基本用协议来分 c<->s c就让前端码农搞,s就让后 ...
- 若依前后端分离前端使用Vue3启动教程
Vue3前端项目地址:https://github.com/yangzongzhuan/RuoYi-Vue3 若依前后端分离后端项目地址:https://gitee.com/y_project/Ruo ...
最新文章
- 计算机网络分为两大阶段,【多选题】计算机网络的发展分为哪些阶段?()
A. 远程终端联机阶段 B. 计算机网络阶段 C. 计算机网络互联阶段 D. 信息高速公路阶段...
- 吊打Magic Leap,微软HoloLens 2不只为炫技
- Python中赋值、浅拷贝、深拷贝
- VMware Workstation
- powerdesigner连接db2生成模型步骤
- 用命令行的方式运行Spark平台的wordcount项目
- sqlserver2000与sqlserver2005驱动与url的区别
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-02 springcloud网关组件zuul
- 傲腾™,企业应用加速利器!
- 唯物辩证法-矛盾论(普遍性+特殊性+斗争性+同一性)
- html css的参考文献,网页制作论文参考文献大全 网页制作参考文献有哪些
- 安卓模拟ibeacon_Android BLE-iBeacon系列(二)扫描识别iBeacon设备
- 【软件工程】软件工程中应用的几种图辨析:系统流程图、数据流图、数据字典、实体联系图、状态转换图、层次方框图、Warnier图、IPO图、层次图、HIPO图、结构图、程序流程图、盒图、PAD图、判定表
- 数据结构总结与知识网图
- 领导力21法则-- 要点总结
- php 项目反应理论,科学网—好文 | 纽约石溪大学:机器学习中基于项目反应理论的集成学习 - 陈培颖的博文...
- 从Antd 源码到自我实现之 Form表单
- js逆向-ast混淆还原进阶案例(1)
- MOOC —— Python语言基础与应用 by 北京大学 第九章 高级扩展模块
- Android获取IMEI和MEID