参考:这里

为什么要加密?

防止密码明文传输。 如不做加密的话,在控制台是可以直接查看到账密传参的,毫无安全性可言。
注意:本文只针对特定情况:如项目中的登录功能

前端的加密方式?

有两种,哈希算法和加密
哈希算法是不可逆的,而加密算法是可逆的。

以下讲的是加密中的RSA加密,如需了解哈希算法请百度
RSA加密是一种非对称加密;还有一种对称加密

什么是非对称加密?

非对称加密算法中,加密密钥和解密密钥是不同的,分为私钥和公钥,我们熟知的 RSA 就是一种非对称加密算法。其特点—采用的一对秘钥机制(即加解密秘钥不同),公钥加密、私钥解密,管理简单,缺点是解密速度慢。
具体过程是先由接收方创建RSA密钥对,接收方通过Internet发送RSA公钥到发送方,同时保存RSA私钥。而发送方创建AES密钥。并用该 AES密钥加密待传送的明文数据,同时用接受的RSA公钥加密AES密钥,最后把用RSA公钥加密后的AES密钥同密文一起通过Internet传输发送 到接收方。当接收方收到这个被加密的AES密钥和密文后,首先调用接收方保存的RSA私钥,并用该私钥解密加密的AES密钥,得到AES密钥。最后用该 AES密钥解密密文得到明文。

非对称加密基本流程

请求:

  1. 服务器端(server)生成密钥对
  2. server给client自己的公钥
  3. client生成AES密钥(aesKey)
  4. client使用自己的RSA私钥(privateKey)对请求明文数据(params)进行数字签名
  5. 将签名加入到请求参数中,然后转换为json格式
  6. client使用aesKey对json数据进行加密得到密文(data)
  7. client使用sever的RSA公钥对aesKey进行加密(encryptkey)
  8. 分别将data和encryptkey作为参数传输给服务器端

服务器端进行请求响应时将上面流程反过来即可


什么是对称加密?

对称加密,指加密和解密都是用同一个密钥,如 AES / DES。从性能上来说,非对称加密相对于对称加密要慢很多,其特点是:算法简单,加密速度快;

RSA前端加密实现

var encrypt=new JSEncrypt();
encrypt.setPublicKey(RSA的公钥);
encrypt.encrypt(加密的内容);

  1. let jse = new JSEncrypt();
  2. jse.setPublicKey('获取到的公钥');
  3. let loginFormTemp = Object.assign({},this.loginForm);
  4. //加密内容
  5. loginFormTemp.password = this.$base64.encode(jse.encrypt(loginFormTemp.password));

安装

  1. npm i jsencrypt

main.js引入

  1. import JsEncrypt from 'jsencrypt'
  2. const base64 = require('js-base64').Base64;
  3. Vue.prototype.$jsEncrypt = JsEncrypt
  4. Vue.prototype.$base64 = base64;

页面具体代码

  1. 点登录的时候,把下面的封装成一个方法调用
  2. this.getPublicKey().then(res=>{ //发送请求,获取公钥
  3. if(res.result==MsgType.SUCCESS) {
  4. let jse = new JSEncrypt();// 密码加密
  5. jse.setPublicKey(res.data.publicKey); // 获取到的公钥处理
  6. let loginFormTemp = Object.assign({},this.loginForm);//表单数据(账号密码等)
  7. //加密内容
  8. loginFormTemp.password = this.$base64.encode(jse.encrypt(loginFormTemp.password));
  9. //发送请求,参数就是加密后的内容,
  10. this.$store.dispatch(loginMethod, loginFormTemp).then((res) => {
  11. //成功失败的处理
  12. )}
  13. }else{
  14. // 加密失败
  15. this.$Message.success('系统繁忙,请稍后再试!');
  16. return
  17. }
  18. }).catch(() => {
  19. });

后端如何解密?

encrypt.setPrivateKey(RSA的私钥);
encrypt.decrypt(解密的内容);