更新记录

1.0.0(2026-07-19)

新增

  • 请求数据加密(配置公钥自动加密 POST 请求的 data
  • 响应数据解密(配置私钥自动解密响应 data 字段)
  • 自定义加解密函数支持(可灵活替换为任意算法)
  • 自动适配 apiFieldMap.data 配置(兼容自定义响应字段名)
  • 加密或解密失败时自动降级(不影响正常请求)

平台兼容性

uni-app(3.8.0)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟

uni-app x(3.8.0)

Chrome Safari Android iOS 鸿蒙 微信小程序

mh-request-encrypt

基于 mh-request 的加解密插件,支持请求加密和响应解密,开箱即用。

本插件是 mh-request 的配套插件,需配合使用。

特性

  • 🔐 请求加密:若配置了公钥或自定义加密函数,则对 POST 请求的 data 进行加密
  • 🔓 响应解密:若配置了私钥或自定义解密函数,则自动解密响应数据
  • 🎛️ 自定义函数:支持自定义加解密逻辑,灵活适配业务需求
  • 🔗 字段映射:自动适配 apiFieldMap 配置,支持自定义响应数据字段名
  • 🔌 即插即用:作为 mh-request 插件,一行代码集成
  • 📦 零依赖:内置 JSEncrypt,无额外包体积负担

快速开始

引入插件

import { Request } from '@/uni_modules/mh-request'
import { encryptPlugin } from '@/uni_modules/mh-request-encrypt'

const request = new Request({
  baseURL: 'https://api.example.com',
  successCode: 1,
  plugins: [
    {
      plugin: encryptPlugin,
      config: {
        publicKey: 'MIIBIjANBg...', // 公钥(Base64,不含 PEM 头尾)
        privateKey: 'MIIEvQIBAD...', // 私钥(Base64,不含 PEM 头尾)
        // encryptFn: (plaintext) => '自定义加密结果',
        // decryptFn: (ciphertext) => '自定义解密结果'
      }
    }
  ]
})

配置项

属性 类型 必填 默认值 说明
publicKey string - 公钥(单行 Base64 字符串,不含 PEM 头尾),用于加密请求数据
privateKey string - 私钥(单行 Base64 字符串,不含 PEM 头尾),用于解密响应数据
encryptFn (plaintext: string) => string - 自定义加密函数,优先级高于默认 JSEncrypt 加密
decryptFn (ciphertext: string) => string - 自定义解密函数,优先级高于默认 JSEncrypt 解密

至少需要配置 publicKey / privateKey / encryptFn / decryptFn 中的任意一个,否则插件不生效。

工作原理

请求加密流程

原始数据 → JSON 序列化 → 加密 → { data: 密文 }
  1. 请求拦截器自动将 POST 请求的 data 对象序列化为 JSON 字符串
  2. 使用公钥或自定义加密函数加密得到密文
  3. 替换请求数据为 { data: 密文 } 结构

响应解密流程

响应数据 → 解密 → JSON 反序列化 → 原始数据
  1. 响应拦截器检测到响应数据包含加密的 data 字段(支持 apiFieldMap 映射)
  2. 使用私钥或自定义解密函数解密得到明文
  3. 自动解析为 JSON 对象

使用示例

基础用法(公钥加密 + 私钥解密)

import { Request } from '@/uni_modules/mh-request'
import { encryptPlugin } from '@/uni_modules/mh-request-encrypt'

const request = new Request({
  baseURL: 'https://api.example.com',
  plugins: [
    {
      plugin: encryptPlugin,
      config: {
        publicKey: 'MIIBIjANBg...',
        privateKey: 'MIIEvQIBAD...'
      }
    }
  ]
})

// POST 请求时,数据会自动加密
const res = await request.post('/user/login', {
  username: 'admin',
  password: '123456'
})
// 实际发送: { data: '加密后的密文' }
// 响应解密后: { username: 'admin', password: '123456' }

仅加密(只配置公钥)

const request = new Request({
  baseURL: 'https://api.example.com',
  plugins: [
    {
      plugin: encryptPlugin,
      config: {
        publicKey: 'MIIBIjANBg...' // 只配公钥,只加密不解密
      }
    }
  ]
})

仅解密(只配置私钥)

const request = new Request({
  baseURL: 'https://api.example.com',
  plugins: [
    {
      plugin: encryptPlugin,
      config: {
        privateKey: 'MIIEvQIBAD...' // 只配私钥,只解密不加密
      }
    }
  ]
})

自定义加解密函数

const request = new Request({
  baseURL: 'https://api.example.com',
  plugins: [
    {
      plugin: encryptPlugin,
      config: {
        publicKey: 'MIIBIjANBg...',
        privateKey: 'MIIEvQIBAD...',
        // 使用国密 SM2 或其他加密算法
        encryptFn: (plaintext) => {
          return sm2Encrypt(plaintext, publicKey)
        },
        decryptFn: (ciphertext) => {
          return sm2Decrypt(ciphertext, privateKey)
        }
      }
    }
  ]
})

配合 apiFieldMap 使用

const request = new Request({
  baseURL: 'https://api.example.com',
  apiFieldMap: {
    code: 'status',
    msg: 'message',
    data: 'result' // 自定义响应数据的字段名
  },
  plugins: [
    {
      plugin: encryptPlugin,
      config: {
        publicKey: 'MIIBIjANBg...',
        privateKey: 'MIIEvQIBAD...'
      }
    }
  ]
})

// 响应数据格式: { status: 1, message: 'success', result: '加密的密文' }
// 解密后: { status: 1, message: 'success', result: { username: 'admin', ... } }

注意事项

  • 公钥和私钥使用裸 Base64 格式(不含 -----BEGIN PUBLIC KEY----- 等头尾),插件内部自动补全 PEM 格式
  • 仅对 POST 请求的 JSON 类型 data 进行加密,其他请求方法保持原样
  • 加密失败时自动降级,保持原始数据不变
  • 解密失败时自动降级,保持原始响应数据不变

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。