参考:这里
为什么要加密?
防止密码明文传输。 如不做加密的话,在控制台是可以直接查看到账密传参的,毫无安全性可言。
注意:本文只针对特定情况:如项目中的登录功能
前端的加密方式?
有两种,哈希算法和加密
哈希算法是不可逆的,而加密算法是可逆的。
以下讲的是加密中的RSA加密,如需了解哈希算法请百度
RSA加密是一种非对称加密;还有一种对称加密
什么是非对称加密?
非对称加密算法中,加密密钥和解密密钥是不同的,分为私钥和公钥,我们熟知的 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作为参数传输给服务器端
服务器端进行请求响应时将上面流程反过来即可
什么是对称加密?
对称加密,指加密和解密都是用同一个密钥,如 AES / DES。从性能上来说,非对称加密相对于对称加密要慢很多,其特点是:算法简单,加密速度快;
RSA前端加密实现
var encrypt=new JSEncrypt();
encrypt.setPublicKey(RSA的公钥);
encrypt.encrypt(加密的内容);
let jse = new JSEncrypt();
jse.setPublicKey('获取到的公钥');
let loginFormTemp = Object.assign({},this.loginForm);
//加密内容
loginFormTemp.password = this.$base64.encode(jse.encrypt(loginFormTemp.password));
安装
npm i jsencrypt
main.js引入
import JsEncrypt from 'jsencrypt'
const base64 = require('js-base64').Base64;
Vue.prototype.$jsEncrypt = JsEncrypt
Vue.prototype.$base64 = base64;
页面具体代码
点登录的时候,把下面的封装成一个方法调用
this.getPublicKey().then(res=>{ //发送请求,获取公钥
if(res.result==MsgType.SUCCESS) {
let jse = new JSEncrypt();// 密码加密
jse.setPublicKey(res.data.publicKey); // 获取到的公钥处理
let loginFormTemp = Object.assign({},this.loginForm);//表单数据(账号密码等)
//加密内容
loginFormTemp.password = this.$base64.encode(jse.encrypt(loginFormTemp.password));
//发送请求,参数就是加密后的内容,
this.$store.dispatch(loginMethod, loginFormTemp).then((res) => {
//成功失败的处理
)}
}else{
// 加密失败
this.$Message.success('系统繁忙,请稍后再试!');
return
}
}).catch(() => {
});
后端如何解密?
encrypt.setPrivateKey(RSA的私钥);
encrypt.decrypt(解密的内容);