前端加密方式

总结下项目中用到的一些加密方式:

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值