前端登陆加密方式RSA+AES
2019-10-17 本文已影响0人
林亚希
前言
为了提高用户登陆的安全性,公司准备整理一份相对安全的登陆模式。
想法
主流加密算法
主流加密算法
- (一)对称加密AES ,其特点是:算法简单,加密速度快;
-
(二)非对称加密方式,代表是RSA加密算法,其特点--采用的一对秘钥机制(即加解密秘钥不同),公钥加密、私钥解密,管理简单,缺点是解密速度慢。
最终方式
具体过程是先由接收方创建RSA密钥对,接收方通过Internet发送RSA公钥到发送方,同时保存RSA私钥。而发送方创建AES密钥。并用该 AES密钥加密待传送的明文数据,同时用接受的RSA公钥加密AES密钥,最后把用RSA公钥加密后的AES密钥同密文一起通过Internet传输发送 到接收方。当接收方收到这个被加密的AES密钥和密文后,首先调用接收方保存的RSA私钥,并用该私钥解密加密的AES密钥,得到AES密钥。最后用该 AES密钥解密密文得到明文。
基本流程
请求:
- 服务器端(server)生成密钥对
- server给client自己的公钥
- client生成AES密钥(aesKey)
- client使用自己的RSA私钥(privateKey)对请求明文数据(params)进行数字签名
- 将签名加入到请求参数中,然后转换为json格式
- client使用aesKey对json数据进行加密得到密文(data)
- client使用sever的RSA公钥对aesKey进行加密(encryptkey)
- 分别将data和encryptkey作为参数传输给服务器端
服务器端进行请求响应时将上面流程反过来即可
使用
- 安装crypto-js
npm install crypto-js
- AES加密工具类
import CryptoJS from ‘crypto-js’
//创建密钥
export function createAesKey() {
const expect = 16
let str = Math.random().toString(36).substr(2)
while (str.length < expect) {
str += Math.random().toString(36).substr(2)
}
str = str.substr(0, 16)
return str
}
//aes
export function encrypt(word, keyStr) {
keyStr = keyStr ? keyStr : 'abcdefgabcdefg12';
var key = CryptoJS.enc.Utf8.parse(keyStr); //Latin1 w8m31+Yy/Nw6thPsMpO5fg==
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.DES.encrypt(srcs, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
//
- RSA加密
npm install jsencrypt
let publickey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiuSQ9WxQqp+j5rpJY+qmAsm2AYPC0Xr4hgEJyEpo8vSh52ITmIby1PvGqztU+T88hP5T3Rlo6J+W6gTgXHbjs/UnKuM+oO2sd/Ox+gjRmLetRil2Iqz0m9rHuTO8FMeulI8VKJ2O4dmXO9XvhFqQ26D4x1LLj8GLO5ZYriCPzUD0hUDqKh/jWj8IUxOO1ooZlaIo915Sbw7P2/JdAISKoivv7KjGJ3DRMq3Vd9sbG3FIHVCIbPuUCoket4Asu4BT51lhTIj3lLxDbYv/350RBl4lWADBsfCHVfPiSQPsCNmD1gfbgMliB6I97NYIc5Jmwnw9OUem39LK9qqrwWptowIDAQAB'
export function RSAencrypt(pas) {
let jse = new JSEncrypt();
jse.setPublicKey(publickey);
return jse.encrypt(pas)
}