学习gm-crypt和sm-crypto加密解密的一天

1:首先 npm  install gm-crypt

npm install gm-crypt

2  下载 sm-crypto

npm install sm-crypto --save

3登入时先调用下

/**
 * 随机生成字符串
 * @param len 指定生成字符串长度
 */
 export function getRandomString(len){
  let min = 0, max = _charStr.length-1, _str = '';
  //判断是否指定长度,否则默认长度为15
  len = len || 15;
  //循环生成字符串
  for(var i = 0, index; i < len; i++){
      index = RandomIndex(min, max, i);
      _str += _charStr[index];
  }
  return _str;
}

随机生成一个16位的字符串

调用后端接口生成一个Key值

引入封装的加密方法

export var SMUtil = {

  sm4Decode(key, context) {
    const SM4 = require("gm-crypt").sm4;
    const sm4Config = {
      key: key,
      mode: "ecb", // 加密的方式有两种,ecb和cbc两种,也是看后端如何定义的,不过要是cbc的话下面还要加一个iv的参数,ecb不用
      cipherType: "base64" // 
    };
    const sm4 = new SM4(sm4Config);
    const decodeData = sm4.decrypt(context);
    return decodeData;
  },

  sm4Encode(key, context) {
    const SM4 = require("gm-crypt").sm4;
    const sm4Config = {
      key: key,
      mode: "ecb", // 加密的方式有两种,ecb和cbc两种,也是看后端如何定义的,不过要是cbc的话下面还要加一个iv的参数,ecb不用
      cipherType: "base64" // 
    };
    const sm4 = new SM4(sm4Config);
    const encryptData = sm4.encrypt(context);
    return encryptData;
  },

  sm2Encode(pubKey, context) {
    const sm2 = require('sm-crypto').sm2;
    const cipherMode = 1 // 1 - C1C3C2,0 - C1C2C3,默认为1
    const encryptData = sm2.doEncrypt(context, pubKey, cipherMode) // 解密结果
    return encryptData;
  },
};

将key值和生成的字符串传入sm2Encode中

              const secret = getRandomString(16);
              const pubKey = await SecretAPI.getPublicKey();
              this.loginForm.publicQKey = pubKey;
              this.loginForm.secret = SMUtil.sm2Encode(pubKey,secret);
              this.loginForm.password = SMUtil.sm4Encode(secret,this.loginForm.password);
              this.$store.dispatch("GetDataSecret", secret);

将return出拉的secret传入sm4Encode中 此时加密完成

然后在请求拦截处

设置解密

        res.data.data = JSON.parse(SMUtil.sm4Decode(store.getters.dataSecret,res.data.encodeData));
        res.data.encodeData = '';

请求接口


import { RSAUtil } from "../utils/secret/rsa";
import { SMUtil } from "../utils/secret/sm.js";
import { getRandomString } from "../utils/index.js"

import constant from "../utils/constant";
import request from '../apis/config'
// import apiMod from '../api';
import {
    BaseUrl_admin
    // BaseUrl_CheckPic,
    // BaseUrl_prient
  } from "./baseFilePath";
// let basePrefixUrl = '/sys/common/secure';

//   export function reqLogin({ userName, passWord }) {
//     return axios.post(
//       "/sys/web/login/loginWithPassword",
//       {
//         username: userName,
//         password: passWord
//       },
//       {
//         baseURL: BaseUrl_admin
//       }
//     );
//   }
// export function reqLogin({ userName, passWord }) {
//     return axios.post(
//       "/sys/web/login/loginWithPassword",
//       {
//         username: userName,
//         password: passWord
//       },
//       {
//         baseURL: BaseUrl_admin
//       }
//     );
//   }
export default {
  async getPublicKey(){
    const { data } = await request({
      url: BaseUrl_admin + '/sys/common/secure/getPublicKey',
      method: 'post'
    });
    return data;
  },
  async resetSecret(){
    const { data } = await request({
      url: BaseUrl_admin + '/sys/common/secure/getPublicKey',
      method: 'post'
    });
    const secret = getRandomString(16);
    const encodeSecret = SMUtil.sm2Encode(data,secret);
    await request({
      url: BaseUrl_admin + '/sys/common/secure/resetSecret',
      method: 'post',
      data: {
        publicQKey: data,
        secret: encodeSecret
      }
    });
    return secret;
  },

  async getSecretKey() {

    const keyPair = RSAUtil.getRSAKeyPair();

    const localPubKey = keyPair.publicKey;
    const localPrvKey = keyPair.privateKey;

    let param = {
      clientVersion: constant.clientInfo.clientVersion,
      clientId: "xxx",
      clientPublicKey: localPubKey
    };
    const { data } = await request({
        url: BaseUrl_admin + '/getSecrteKey',
        method: 'post',
        data: param
    });
    if(data && data.dataSecret){
        const encodeSecret = data.dataSecret;
        const secretByte = RSAUtil.decode(encodeSecret, localPrvKey);
        const secret = secretByte.toString("utf8");
        return secret;
    }
    
    return null;
  }
};

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值