RSA加密工具,从后台获取公钥对数据进行加密再传输,保护敏感数据。


简介

RSA是被研究得最广泛的公钥算法,从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。


安装

加密工具,jsencrypt。

cdn引入:

<script src=""></script>

npm或cnpm下载:

//1.安装依赖   
cnpm install jsencrypt --save
//在main.js引入   
import { JSEncrypt } from 'jsencrypt'


使用

配置

某项目中jsencrypt的配置如下(main.js文件):

  • 加密函数,挂载到VUE原形上(prototype属性可以向对象中添加属性或方法),后续通过$encryptedData调用。
  • 获取公钥函数,挂载到VUE原形上,后续通过$getPublicKey调用。
  • 获取到的公钥,保存在$publickey中,挂载在VUE原形上。
  • 注意:要使用elementui的弹窗组件(获取公钥函数中有使用到),需要保证下边的配置在elementui的import之后。
//在main.js中挂载全局方法:
//使用时调用Vue的函数[this|Vue].$encryptedData即可。
Vue.prototype.$encryptedData = function(publicKey, data) {//参数为公钥、待加密的数据
  //new一个对象
  let encrypt = new JSEncrypt();
  //设置公钥
  encrypt.setPublicKey(publicKey);
  //data是要加密的数据
  let result = encrypt.encrypt(data);
  return result
}
Vue.prototype.$getPublicKey = function() {//获取RSA公钥,挂载到Vue上,可通过this.$getPublicKey调用
  axios({//在前边得将Axios导入为axios,这里才可以调用
      method: 'get',
      url: '/publickey',//前边得配置了全局URL才能正常发起Ajax请求
      responseType: 'text'
    })
    .then(response => {
      Vue.prototype.$publickey = response.data;//将获取到得公钥,又保存在Vue原形上的自定义变量$publickey上
    })
    .catch(err => {
      elementui.Message.error(err.message);//在前边得将ElementUI导入为elementui,这里才可以调用
    });
}



vue页面应用

//1.在钩子函数created中向服务器获取公钥:
  created() {
    this.$getPublicKey();
  }

//2.在发起Ajax请求时,将用户名和密码加密再发送给服务器:
  //登录
  this.$http({
      method: 'post',
      url: '/accounts/token',
      responseType: 'json',
      data: {
        username: this.$encryptedData(this.$publickey, this.loginForm.username.trim()),
        password: this.$encryptedData(this.$publickey, this.loginForm.password.trim())
      }
    })
    .then(respon => { //Ajax 请求成功
      this.loading = false; //关闭 加载动画
      var data = respon.data;
      if (data.meta.status != "200") {
        this.shake(this.isShakeForm); //表单 摇晃动画
        this.$message.error(data.meta.msg);
      } else {
        this.$message.success('登录成功');
        // 1、将登陆成功之后的token, 保存到客户端的sessionStorage中; localStorage中是持久化的保存
        //   1.1 项目中出现了登录之外的其他API接口,必须在登陆之后才能访问
        //   1.2 token 只应在当前网站打开期间生效,所以将token保存在sessionStorage中
        window.sessionStorage.setItem('token', data.token);
        window.sessionStorage.setItem('account', JSON.stringify(data.account));

        // 2、通过编程式导航跳转到后台主页, 路由地址为:/home
        this.$router.push('/home');
      }
    })
    .catch(err => { //Ajax 请求出错
      this.loading = false; //关闭 加载动画
      this.$message.error(err.message);
      this.shake(this.isShakeForm); //表单 摇晃动画
    });