总结下项目中用到的一些加密方式:
一、RSA
项目的登录页面要加密用户名和密码,前端利用RSA进行加密,后端用java实现的解密过程
使用JSEncrypt.js插件(jsencrypt就是一个基于rsa加解密的js库)
-
使用公钥加密的数据,利用私钥进行解密
-
使用私钥加密的数据,利用公钥进行解密
-
前端大概的加密流程
- 前端调用后端公钥的接口获取公钥---->
- 前端使用JSEncrypt中间件设置公钥,并加密密码---->
- 前端将加密后的数据通过接口(如登录接口)传给后台---->
- 后台使用密钥解密前端加密的数据,再用解密后的数据查询或者保存到数据库中
-
使用过程
-
安装
npm install jsencrypt
-
引入
import JSEncrypt from 'jsencrypt'
-
ras加密
let encryptStr = new JSEncrypt() // 创建加密对象实例 let pubKey = '-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1QQRl0HlrVv6kGqhgonD6A9SU6ZJpnEN+Q0blT/ue6Ndt97WRfxtSAs0QoquTreaDtfC4RRX4o+CU6BTuHLUm+eSvxZS9TzbwoYZq7ObbQAZAY+SYDgAA5PHf1wNN20dGMFFgVS/y0ZWvv1UNa2laEz0I8Vmr5ZlzIn88GkmSiQIDAQAB-----END PUBLIC KEY-----' //获取后端传给的公钥 encryptStr.setPublicKey(pubKey)//设置公钥 let rsaPassWord = encryptStr.encrypt('要加密的内容') // 对内容进行加密
-
rsa解密
var decryptStr = new JSEncrypt()//创建解密对象实例 var priKey = '-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQC1QQRl0HlrVv6kGqhgonD6A9SU6ZJpnEN+Q0blT/ue6Ndt97WRfxtSAs0QoquTreaDtfC4RRX4o+CU6BTuHLUm+eSvxZS9TzbwoYZq7ObbQAZAY+SYDgAA5PHf1wNN20dGMFFgVS/y0ZWvv1UNa2laEz0I8Vmr5ZlzIn88GkmSiQIDAQABAoGBAKYDKP4AFlXkVlMEP5hS8FtuSrUhwgKNJ5xsDnFV8sc3yKlmKp1a6DETc7N66t/Wdb3JVPPSAy+7GaYJc7IsBRZgVqhrjiYiTO3ZvJv3nwAT5snCoZrDqlFzNhR8zvUiyAfGD1pExBKLZKNH826dpfoKD2fYlBVOjz6i6dTKBvCJAkEA/GtL6q1JgGhGLOUenFveqOHJKUydBAk/3jLZksQqIaVxoB+jRQNOZjeSO9er0fxgI2kh0NnfXEvH+v326WxjBwJBALfTRar040v71GJq1m8eFxADIiPDNh5JD2yb71FtYzH9J5/d8SUHI/CUFoROOhxr3DpagmrnTn28H0088vubKe8CQDKMOhOwx/tS5lqvN0YQj7I6JNKEaR0ZzRRuEmv1pIpAW1S5gTScyOJnVn1tXxcZ9xagQwlT2ArfkhiNKxjrf5kCQAwBSDN5+r4jnCMxRv/Kv0bUbY5YWVhw/QjixiZTNn81QTk3jWAVr0su4KmTUkg44xEMiCfjI0Ui3Ah3SocUAxECQAmHCjy8WPjhJN8y0MXSX05OyPTtysrdFzm1pwZNm/tWnhW7GvYQpvE/iAcNrNNb5k17fCImJLH5gbdvJJmCWRk=-----END RSA PRIVATE KEY----' decryptStr.setPrivateKey(priKey)//设置秘钥 let uncrypted = decryptStr.decrypt('解密的内容')//解密之前拿公钥加密的内容
-
二、md5
-
安装
npm install --save js-md5
-
引入
import md5 from 'js-md5';
-
md5加密
md5('hello world') // 5eb63bbbe01eeed093cb22bb8f5acdc3
三、AES
使用AES实现密码加密解密,主要是通过ecb和cbc两种模式
ECB: 是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
CBC: 是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。(不容易主动攻击,安全性好于ECB,是SSL、IPSec的标准)
使用过程:
-
先安装 crypto-js
npm install crypto-js --save-dev
-
ECB模式:
import CryptoJS from "crypto-js"; // 加密 encrypt(word, keyStr) { // @param keyStr string 加密key(16位) // @param word string 要加密的内容 keyStr = keyStr ? keyStr : "absoietlj32fai12"; let key = CryptoJS.enc.Utf8.parse(keyStr); let srcs = CryptoJS.enc.Utf8.parse(word); let encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString(); }, // 解密 decrypt(word, keyStr) { keyStr = keyStr ? keyStr : "absoietlj32fai12"; var key = CryptoJS.enc.Utf8.parse(keyStr); var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return CryptoJS.enc.Utf8.stringify(decrypt).toString(); }
-
CBC模式:
import CryptoJS from "crypto-js"; // 加密 encrypt(word, keyStr, ivStr) { keyStr = keyStr ? keyStr : "absoietlj32fai12"; ivStr = ivStr ? ivStr : "absoietlj32fai12"; let key = CryptoJS.enc.Utf8.parse(keyStr); let iv = CryptoJS.enc.Utf8.parse(ivStr); let srcs = CryptoJS.enc.Utf8.parse(word); let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }); return encrypted.toString(); }, // 解密 decrypt(word, keyStr, ivStr) { keyStr = keyStr ? keyStr : "absoietlj32fai12"; ivStr = ivStr ? ivStr : "absoietlj32fai12"; var key = CryptoJS.enc.Utf8.parse(keyStr); let iv = CryptoJS.enc.Utf8.parse(ivStr); var decrypt = CryptoJS.AES.decrypt(word, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }); return decrypt.toString(CryptoJS.enc.Utf8); }
参考网址:https://www.jb51.net/article/167504.htm