加密/解密应用场景
-
前言: 通常在前后端之间数据传输经常会涉及到一些敏感数据、cookie携带的token加密等问题。
-
提到加密,相对于后台开发来说,遇到最多的需要加密处理的应用场景应该是接口的加密签名校验了。不过这种一般都用于服务端与服务端之间的相互调用。因为没有暴露在外的代码这种加密校验相对比较安全。但javaScript不一样,它是运行在浏览器端的一种脚本语言。基本除了在sojson.v6加密过的js代码,黑客可以通过逆向分析你的js代码来盗取一些数据。
常用的js加密:
-
对称加密(AES):用的同一个密钥进行加解密的
优点: 速度快
缺点: 在传输密钥过程中,这个密钥容易被拦截,导致密钥泄漏,安全性不高
-
非对称加密(RSA): 生成密钥,分别为公钥和秘钥,公钥对数据进行加密,私钥对数据进行解密
优点: 只需要服务端把公钥,传递给前端,前端通过公钥进行加密,服务端通过私钥解密,安全性很高
缺点: 速度慢
1、 js内置api(escape和unescape)
const code = 'hello world';
const _enCode = escape(code); // 加密
const _unescapeCode = unescape(code); // 解密
console.log('加密code前:', code); // 加密code前: hello world
console.log('加密code后:',_enCode); // 加密code后:hello%20world
console.log('解密code后:', _unescapeCode); // 解密code后: hello world
由此可以看到用escape函数加密后,字符变成了%开头形式的特殊编码。需要用unescape反编译回来。escape/unescape通常应用于url中携带数据加密较为多些。
2、md5加密
我这里演示借助了crypto插件(项目里安装了),没有的话可以自行安装一下,安装地址: https://github.com/brix/crypto-js
import Crypto from "crypto";
const user_key = 'md5_121212';
const passWord = Crypto.createHash('md5').update(`${user_key}\n`).digest('hex');
console.log('passWord:', passWord);
MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。md5加密一般用于确保文件和代码的唯一性,可以根据计算代码的md5值来判断代码是否被改变。不过md5属于对称加密范畴。
3、 des/aes加密方式
DES是一种使用密钥加密的块算法,已被美国联邦政府的国家标准局授权在非密级政府通信中使用
我这里演示借助了crypto插件(项目里安装了),没有的话可以自行安装一下,安装地址: https://github.com/brix/crypto-js
import crypto from "crypto";
const message = 'hello des';
const key = 9727;
const keyHex = crypto.enc.Utf8.parse(key);
const encrypted = crypto.DES.encrypt(
message,
keyHex,
{
mode: crypto.mode.ECB,
padding: crypto.pad.Pkcs7,
}
);
// 打印加密结果
console.log(encrypted.toString());
4、 RSA双向加密解密
-
RSA是被研究得最广泛的公钥算法,从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
-
使用:服务端和客户端分别生成自己的RSA密钥,服务端拿客户端的公钥,客户端拿服务端的公钥,彼此的数据都可以加解密,但是缺点很明显,就是加解密数据速度慢。
插件安装地址: https://github.com/rzcoder/node-rsa
import rsa from 'node-rsa';
const key = new rsa({b: 512});
const text = 'hello rsa!';
// 加密
const encrypted = key.encrypt(text, 'base64');
// 打印加密结果
console.log(encrypted);
// 解密
const decrypted = key.decrypt(encrypted, 'utf8');
// 打印解密结果
console.log(decrypted);
以上介绍了几种加密方式,希望可以帮助得到你,有错误也可指出可以互相交流交流。