首页 > 其他分享 >基于sm-crypto的sm4的请求加密&响应加密

基于sm-crypto的sm4的请求加密&响应加密

时间:2023-10-24 14:24:17浏览次数:34  
标签:加密 log res sm4 crypto console config const

有时候需要对项目的请求和返回值进行加密请求,因而笔者使用了sm4,读者也可以使用别的库如md5

封装加解密:

// ciphertext.js
const sm4 = require('sm-crypto').sm4
// 此为密文key,非常重要
export const CIPHERTEXT = `wzdxcskwzdxcskwzdxcskwzdxcskwzdxcsk` //我真的想吃烧烤我真的想吃烧烤我真的想吃烧烤我真的想吃烧烤
/**
 * 参考:
 * https://github.com/JuneAndGreen/sm-crypto#sm4
 * 
 * */
// 数据加密 用于axios请求拦截器
export const encryptSm4 = ( requestParams = ''  )=>{
  if (!requestParams) return 
   return sm4.encrypt(requestParams, CIPHERTEXT)
}

// 数据解密 用于axios相应拦截器
export const decryptSm4 = ( result = ''  )=>{
  if (!result) return 
   return sm4.decrypt(result, CIPHERTEXT)
}

响应/请求拦截中使用加解密方法,以下只写要改动的,其余的可以不变

// request.js
import axios from "axios";
import store from "../store";
import { encryptSm4, decryptSm4 } from "./ciphertext";
//生成axios实例
const service = axios.create({
  // axios默认统一数据
  timeout: 120000, //指定请求超时的毫秒数(0 表示无超时时间)
  // baseURL:xxxx, //可能有不同类型的api地址,可以在这里设置baseurl,后续中用以对比是否源于指定的url
  // 如果要校验请求类型,就需要先在这里声明`contenttype`
  headers: {
    "Content-Type": "application/json" // 设置默认json格式以规避在拦截器中拿不到 content-type问题
  }
});
// 确认config配置项
const configCheck = (conf, type) => {
  // 此处可根据需要自定义校验
  const isPost = conf.method.toUpperCase() === `POST`; // 是否post
  // const jsonReg =  /application\/json/; // 正则表达式匹配'application/json'
  // const isJSON = jsonReg.test(conf.headers[`Content-Type`])    // 是否JSON
  const isFromBaseURL = conf.baseURL.includes(process.env.VUE_APP_BASE_API); //是否基于baseurl
  // console.log('isFromBaseURL :>> ', conf.baseURL, isFromBaseURL);
  // console.log('process.env.VUE_APP_BASE_API :>> ', process.env.VUE_APP_BASE_API); 
  return {
    send: [isFromBaseURL, isPost],
    receive: [isFromBaseURL]
  }[type].every(v => v);
};
// 请求拦截配置
/**
 * 有以下方可进行加密:
 *   configCheck 为true
 *   明确`store`中`encryption`为1  后端控制是否需要将请求/响应加密
 service.interceptors.request.use(config=>{
  ...other code...
  const isEncrypted = store.encryption === 1
  if (isEncrypted && configCheck(config, `send`)) {
      try {
        const reqData = encryptSm4(JSON.stringify(config[`data`]));
        config[`data`] = reqData ? reqData : config[`data`];
      } catch (error) {
        console.log("error :>> ", error);
      }
  }
  ...other code...
return config
})

// 响应拦截

service.interceptors.response.use(response=>{
    let res = response.data; // 这里故意用了`let` 因为加密态下可能要改
// ---------------------- 此处为解密校验
    const isEncrypted = store.encryption === 1
    // 加密态下返回的只有一堆加密str,因而没有`res.cdoe`属性
    if (!res.code && configCheck(response.config, `receive`) && isEncrypted) {
      try {
        // 解析加密数据
        res = JSON.parse(decryptSm4(res));
        if (typeof res === `string`) {
          console.log(`--------------------`);
          console.log("res :解析失败返回值>> ", res);
          console.log("失败接口路径为 :>> ", response.config.url);
          console.log("接口方法为 :>> ", response.config.method);
          console.log(`--------------------`);
        }
        // 解密后数据不一定是正常返回值,因而这里做了简单校验
        if (res.code && Number(res.code) !== 200) {
          Message({
            message: res.msg || "当前网络繁忙,请稍后重试!",
            type: "error",
            duration: 3 * 1000
          });
          return Promise.reject(
            new Error(res.msg || "当前网络繁忙,请稍后重试")
          );
        }
      } catch (error) {
        console.log(`--------------------`);
        console.log("error :>解析异常告警> ", error);
        console.log("res :解析失败返回值>> ", res);
        console.log("失败接口路径为 :>> ", response.config.url);
        console.log("接口方法为 :>> ", response.config.method);
        console.log(`--------------------`);
      }
    }
// 

标签:加密,log,res,sm4,crypto,console,config,const
From: https://www.cnblogs.com/hjk1124/p/17784668.html

相关文章

  • 成品直播源码推荐,用JNI生成so文件,加密解密需要的hascode生成代码
    成品直播源码推荐,用JNI生成so文件,加密解密需要的hascode生成代码try{      PackageInfopackageInfo=getPackageManager().getPackageInfo(getPackageName(),PackageManager.GET_SIGNATURES);      Signature[]signs=packageInfo.signatures; ......
  • 使用rsa对明文加密与解密
    公钥加密,私钥解密/***加密**@paramplaintext明文*@parampublicKeyStr公钥字符*@return*@throwsException*/publicstaticStringrsaEncrypt(Stringplaintext,StringpublicKeyStr)throwsException{......
  • FSCTF 2023(公开赛道)CRYPTO WP
    RSA11、题目信息提交格式:FSCTF{你所解出的内容}p=1458769258361q=4556983871563e=17求d2、解题方法expfromgmpy2import*p=1458769258361q=4556983871563e=17d=int(invert(e,(p-1)*(q-1)))print(d)#FSCTF{5865518808244394324786753}做不出来就别阴阳怪气......
  • DES加密
    DES加密简介DES加密算法是对称密钥加密算法、分组加密算法。DES(DataEncryptionStandard,数据加密标准)的出现是现代密码发展史上的一个非常重要的事件,它是密码学历史上第一个广泛应用于商用数据保密的密码算法,开创了公开密码算法、公开竞选密码算法的先例,极大地促进了密码学的......
  • DASCTF X CBCTF 2023|无畏者先行 CRYPTO—WP
    EzRSA1、题目信息fromCrypto.Util.numberimport*importrandomfromgmpy2import*fromlibnumimport*fromflagimportflagdefpadding(f):random_chars=bytes([random.randint(0,255)for_inrange(32)])f=f+random_charsreturnfdefg......
  • JS加密/解密之闭包的运用
    深入探讨JavaScript闭包的演变与应用摘要:本文将深入探讨JavaScript闭包的概念、特性以及其在实际开发中的应用。我们将从闭包的起源开始,探讨它在JavaScript编程中的重要性,并通过实例展示闭包在不同场景下的灵活应用。引言JavaScript作为一种高度灵活的编程语言,一直以其独特的特性......
  • HTTPS 的加密流程
    HTTPS是在HTTP的基础上进行了一层加密,加密就是把明文(要传输的信息)进行一系列变换,生成密文。解密就是把密文再进行一系列变换,还原成明文。在这个加密和解密的过程中,往往需要一个或者多个中间的数据,辅助进行这个过程,这样的数据称为密钥。HTTPS的工作过程既然要......
  • js逆向·找到登录时目标网站的加密算法的几种方式
    js逆向·找到登录时目标网站的加密算法的几种方式为什么要去找到目标网站的加密密码方法:为了要把我们的payload正确的带入目标网站的服务器进行逻辑验证,那么就需要知道对方使用的什么加密或者编码规则来处理数据的,比如说我们输入的密码被base64编码了,然后发送给后端,后端会进行解......
  • 【代码分享】使用 avx2 + 查表法,优化凯撒加密
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯接上一篇:【代码分享】使用avx512+查表法,优化凯撒加密好不容易捣鼓出来了avx512指令集的查表法代码,可是部署的时候发现服务器不支持avx512指令集。终于,avx2......
  • PolarD&N2023秋季个人挑战—Crypto全解
    EasyRSA(额。。这个题看错了不是挑战赛的。这里当做好题记录下来了)题目信息:500分5Polar币fromCrypto.Util.numberimportbytes_to_long,long_to_bytes,getPrimeimportgmpy2,osp=getPrime(512)q=getPrime(512)n=p*qe=65537c=pow(flag1,e,n)print(he......