更新记录

1.0.0(2026-10-15)

  • 新版发布全端加解密插件支持MD5(可加盐)、AES、RSA
  • 支持iOS、Android、HarmonyOS、web、微信小程序
  • 支持uniapp、uniappx、vue2(鸿蒙端不支持vue2)、vue3

平台兼容性

uni-app(5.02)

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

uni-app x(5.02)

Chrome Safari Android iOS 鸿蒙 微信小程序
√ √ √ √ √ √

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× × × √

特别提醒

  • 购买本插件前,请先试用、并充分自测后再购买,购买后无法退款;
  • 如有使用上的疑问、bug,可以进交流群联系作者;
  • 结合文档和示例代码集成使用;
  • iOS、Android试用必须先打基座、试用必须先打基座、试用必须先打基座重要事情说三遍;
  • uniapp项目的HarmonyOS、web/微信小程序需要源码授权才能使用。
  • 结合示例工程集成和试用 uniappx的示例工程在uniapp项目的static/EncryptionDemo.zip。

1. 导入与调用

将插件放在 uni_modules/yt-encryption。App 端制作并安装包含插件的自定义基座;Web、微信小程序直接运行或构建,无需制作基座、安装 npm 依赖或引用在线 CDN。uni-app 在 .vue 的 <script> 中调用,uni-app x 在 .uvue 的 <script lang="uts"> 中调用。下面按需导入,调用代码可放入页面 methods 中。

import {
  md5, aesGenerateKey, aesDeriveKey, aesEncrypt, aesDecrypt,
  rsaGenerateKeyPair, rsaLoadExampleKeys,
  rsaMaximumPlaintextLength, rsaEncrypt, rsaDecrypt
} from '@/uni_modules/yt-encryption'

App / Web / 微信小程序使用相同的导入、参数与回调,下面每种调用均适用。项目包含其他未支持平台时,导入和调用可以条件编译:uni-app 使用 APP-PLUS || APP-HARMONY || H5 || MP-WEIXIN,uni-app x 使用 APP || WEB || MP-WEIXIN。

微信小程序在 HBuilderX 中选择“运行到微信开发者工具”。uni_modules 插件随宿主项目编译,并非微信 plugin.json 独立插件(该环境不支持所需随机数接口)。无需配置请求合法域名;密码运算和示例 PEM 读取都在本地进行。RSA 4096 位生成和默认 600000 次 PBKDF2 在手机上可能较慢,异步回调完成前请保留 loading、避免重复点击;时间片不等于后台线程,大数据仍建议 AES 加密正文、RSA 只加密 AES 密钥。

所有方法通过回调返回结果,不能用 return 或直接 await 获取结果。以下三个回调适用于每个方法,均可省略:

参数 类型 说明
success function 成功回调,参数为该方法的结果对象
fail function 失败回调,参数为 { errCode: number, errSubject: string, errMsg: string };errSubject 固定为 yt-encryption
complete function success 或 fail 之后执行,参数见下面示例
md5({
  text: 'abc',
  success: (res) => { console.log(res.data) },
  fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) },
  complete: (event) => {
    // 成功:{ success: true, result: 成功结果, error: null }
    // 失败:{ success: false, result: null, error: 错误对象 }
    // 可在这里结束 loading。
  }
})

编码与失败说明

编码参数可选:utf8(普通文本)、base64(标准 Base64)、hex(十六进制,不带 0x、长度为偶数)。参数值区分大小写。长度限制指解码后的字节数,不是字符串字符数。

errCode 含义
9010001 参数错误,如密钥长度不符、编码错误、PEM 格式错误、RSA 单块超长
9010002 加解密失败,如 GCM 认证失败、RSA 密钥或填充不匹配、系统运算失败;Web 可能是非安全上下文或缺少 Web Crypto;微信小程序可能是安全随机数接口缺失、失败或返回异常,errMsg 会说明原因,不会降级到 Math.random
9010003 预留的平台未实现错误;当前三个 App 端、Web 和微信小程序均已实现
9010004 插件内部请求或结果解析失败
9010005 示例 PEM 文件缺失、路径或权限错误、文件内容不可读

失败时读取 errCode 和 errMsg,不会同时返回成功结果。非 GCM 的 AES 模式没有认证,密钥错误不一定会报错。

2. MD5:md5

md5({
  text: 'abc',
  salt: '',
  success: (res) => { console.log(res.data) },
  fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
})
参数 类型 必填 默认值 说明
text string 是 — 原始文本,允许空字符串
salt string 否 空字符串 盐,计算的是 UTF-8(text + salt),盐拼在文本后面

成功结果:{ data: '900150983cd24fb0d6963f7d28e17f72', encoding: 'hex' }(上例)。data 为 32 位小写十六进制摘要。MD5 不支持解密,不用于安全存储密码。

3. 生成 AES 密钥:aesGenerateKey

aesGenerateKey({
  keySize: 256,
  encoding: 'base64',
  success: (res) => {
    // AES 调用时传 key: res.data、keyEncoding: res.encoding。
  },
  fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
})
参数 类型 必填 默认值 说明
keySize number 否 256 128 / 192 / 256 位,分别生成 16 / 24 / 32 字节随机密钥
encoding string 否 base64 密钥输出编码:base64 / hex

成功结果:{ data: 密钥字符串, encoding: 输出编码, keySize: 密钥位数 }。插件不会自动保存密钥。

4. 用密码生成 AES 密钥:aesDeriveKey

适合把用户输入的密码通过 PBKDF2 转成 AES 密钥;不是直接给短密码补零。下面借用 aesGenerateKey 生成随机盐:

aesGenerateKey({
  keySize: 128,
  success: (saltResult) => {
    aesDeriveKey({
      password: '用户输入的密码',
      salt: saltResult.data,
      saltEncoding: saltResult.encoding,
      keySize: 256,
      iterations: 600000,
      prf: 'sha256',
      encoding: 'base64',
      success: (res) => {
        // res.data 是 AES 密钥;另存盐、iterations、prf、keySize,解密时用同一密码重新派生。
      },
      fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
    })
  },
  fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
})
参数 类型 必填 默认值 说明
password string 是 — 用户密码,按 UTF-8 处理,不自动去除空格
salt string 是 — 非空盐;建议随机至少 16 字节,需保存
saltEncoding string 否 base64 salt 编码:utf8 / base64 / hex
keySize number 否 256 128 / 192 / 256 位
iterations number 否 600000 迭代次数,1~10000000 的整数
prf string 否 sha256 sha1 / sha224 / sha256 / sha384 / sha512
encoding string 否 base64 密钥输出编码:base64 / hex

成功结果:{ data: 密钥字符串, encoding: 输出编码, keySize: 密钥位数 }。不返回密码、盐或派生配置;派生成功也不代表密码输入正确。

5. AES 加密:aesEncrypt

下面演示 GCM 加密,并直接用返回值解密。示例固定密钥仅供测试,实际使用可调用 aesGenerateKey 生成。

aesEncrypt({
  data: JSON.stringify({ message: '你好' }),
  dataEncoding: 'utf8',
  key: '00112233445566778899aabbccddeeff',
  keyEncoding: 'hex',
  mode: 'gcm',
  padding: 'none',
  outputEncoding: 'base64',
  success: (encrypted) => {
    aesDecrypt({
      data: encrypted.data,
      dataEncoding: encrypted.encoding,
      key: '00112233445566778899aabbccddeeff',
      keyEncoding: 'hex',
      mode: 'gcm',
      padding: 'none',
      iv: encrypted.iv,
      ivEncoding: encrypted.encoding,
      tag: encrypted.tag,
      tagEncoding: encrypted.encoding,
      outputEncoding: 'utf8',
      success: (plain) => { console.log(plain.data) },
      fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
    })
  },
  fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
})
参数 类型 必填 默认值 说明
data string 是 — 明文;JSON 对象先用 JSON.stringify 转成字符串
dataEncoding string 否 utf8 明文编码:utf8 / base64 / hex
key string 是 — AES 密钥,解码后必须是 16 / 24 / 32 字节,对应 128 / 192 / 256 位;不自动补齐
keyEncoding string 否 base64 密钥编码:utf8 / base64 / hex;例如 16 字节密钥用 hex 表示需 32 个字符
mode string 否 gcm gcm / cbc / ctr / cfb(CFB128)/ cfb8 / ofb / ecb
padding string 否 none none / pkcs7 / zero;具体限制见下表,是给明文填充,不是给密钥填充
iv string 否 非 ECB 自动随机生成 GCM 跨端建议 12 字节,HarmonyOS 接受 12~16 字节;其它非 ECB 模式必须 16 字节;ECB 不传。同一密钥下不要重复使用 IV/nonce
ivEncoding string 否 base64 输入 iv 的编码:utf8 / base64 / hex
aad string 否 无 仅 GCM 支持的附加认证数据,不加密;解密时必须完全一致
aadEncoding string 否 utf8 aad 编码:utf8 / base64 / hex
outputEncoding string 否 base64 密文及返回 iv/tag 的统一编码:base64 / hex
padding 值 使用要求
none 不填充;CBC/ECB 的明文字节数必须为 16 的倍数;其它模式只能使用 none
pkcs7 仅 CBC/ECB 可用,自动补齐并在解密时去除填充
zero 仅 CBC/ECB 可用,补零至 16 字节对齐;解密需传 originalPlaintextLength
成功字段 类型 说明
data string 密文
encoding string data、iv、tag 的编码
mode string 本次模式
padding string 本次填充
iv string,可选 非 ECB 返回;解密需原样传回
tag string,可选 仅 GCM 返回的认证标签,解码后为 16 字节;解密必需
originalPlaintextLength number 原始明文字节数;ZeroPadding 解密必需

结果不包含 key、aad。请自行保留解密所需的密钥、模式、填充、编码、iv、tag、aad 和原始长度。

6. AES 解密:aesDecrypt

调用示例见上一节 success 中的 aesDecrypt。解密参数必须与加密端一致,密文与标签分开传,不要把 tag 拼入 data。

参数 类型 必填 默认值 说明
data string 是 — 加密返回的密文
dataEncoding string 否 base64 密文编码:utf8 / base64 / hex,通常取加密结果 encoding
key string 是 — 加密时同一密钥,解码后为 16 / 24 / 32 字节
keyEncoding string 否 base64 密钥编码:utf8 / base64 / hex
mode string 否 gcm gcm / cbc / ctr / cfb / cfb8 / ofb / ecb,与加密一致
padding string 否 none none / pkcs7 / zero,与加密一致;仅 CBC/ECB 支持后两种
iv string 非 ECB 必填 — 加密时的 iv/nonce;ECB 不传,不可重新随机生成
ivEncoding string 否 base64 iv 编码:utf8 / base64 / hex,通常取加密结果 encoding
tag string GCM 必填 — 加密时的 16 字节认证标签;非 GCM 不传
tagEncoding string 否 base64 tag 编码:utf8 / base64 / hex,通常取加密结果 encoding
aad string 加密用过则必填 无 仅 GCM,内容必须与加密时一致
aadEncoding string 否 utf8 aad 编码:utf8 / base64 / hex
originalPlaintextLength number zero 必填 — 加密返回的原始明文字节数,非负整数;其它填充不传
outputEncoding string 否 utf8 明文输出编码:utf8 / base64 / hex;二进制明文选 base64 或 hex

成功结果:{ data: 解密后的明文, encoding: 输出编码 }。GCM 认证失败会进入 fail,不返回明文。

7. 生成 RSA 密钥对:rsaGenerateKeyPair

rsaGenerateKeyPair({
  keySize: 2048,
  success: (res) => {
    // res.publicKey 用于加密,res.privateKey 用于配对解密。
  },
  fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
})
参数 类型 必填 默认值 说明
keySize number 否 2048 2048 / 3072 / 4096 位

成功结果:{ data: '', encoding: 'pem', keySize: 密钥位数, publicKey: 公钥PEM, privateKey: 私钥PEM }。返回完整 PKCS#1 PEM 文本,每次生成新密钥,不自动保存。

8. 读取公共 PEM:rsaLoadExampleKeys

App / Web 共用下面两份文件。服务端给的是完整公钥文本时,可直接传给 rsaEncrypt 的 publicKey,无需保存文件。

uni_modules/yt-encryption/static/rsa-example/rsa_public_key.pem
uni_modules/yt-encryption/static/rsa-example/rsa_private_key.pem

如果服务端提供了 PEM 公钥文件,可以用它替换插件 static/rsa-example/ 目录中的公钥文件,文件名必须保持为 rsa_public_key.pem。如需替换用于客户端解密的配对私钥,文件名必须保持为 rsa_private_key.pem,并放在同一目录;不要将服务端生产私钥放入客户端。替换公钥或私钥文件后,iOS 和 Android 端需要重新制作并安装包含该插件的自定义基座,再重新运行项目,确保新文件生效。

rsaLoadExampleKeys({
  includePrivateKey: true, // 本地加解密测试才设为 true
  success: (res) => {
    // res.publicKey / res.privateKey 是完整 PEM 内容,不是文件路径。
    // 分别传给 rsaEncrypt 的 publicKey、rsaDecrypt 的 privateKey。
  },
  fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
})
参数 类型 必填 默认值 说明
includePrivateKey boolean 否 false false 只读公钥;true 同时读取配对的测试私钥

成功结果:{ data: '', encoding: 'pem', publicKey: 公钥PEM };true 时额外返回 privateKey。文件缺失或不可读时 fail,错误码为 9010005,不返回部分结果。

替换文件时保留文件名和完整 PEM 头尾、换行,并重新构建/同步完整应用资源。Web 按部署的 base 路径请求公共 static 文件,服务器必须返回 PEM,而不是路由兜底的 HTML。微信小程序通过 wx.getFileSystemManager 读取代码包内的 uni_modules/yt-encryption/static/rsa-example/,不走网络;若报 9010005,检查构建产物是否包含对应文件,以及微信项目的 packOptions.ignore 是否排除了 PEM。文件读取失败统一通过 9010005 返回。

测试私钥可从 App/小程序包提取,或通过 Web 静态资源下载,正式发布前必须删除,不能放入服务端生产私钥。 服务端返回公钥时,直接把完整字符串传给 rsaEncrypt({ publicKey: serverPublicKeyPEM, ... }),无需先保存文件或修改插件源码。

9. RSA 单块长度查询:rsaMaximumPlaintextLength

下面的 serverPublicKeyPEM 需替换为服务端返回的完整公钥字符串;同样适用于后面的 RSA 加密示例。

rsaMaximumPlaintextLength({
  publicKey: serverPublicKeyPEM,
  padding: 'oaepSHA256',
  success: (res) => { console.log(res.maximumPlaintextLength) },
  fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
})
参数 类型 必填 默认值 说明
publicKey string 是 — 完整公钥 PEM 或公钥 DER 的 Base64,不是文件路径
padding string 否 oaepSHA256 oaepSHA256 / oaepSHA1 / pkcs1

成功结果:{ data: '', encoding: '', maximumPlaintextLength: 单块最大明文字节数 }。2048 位密钥下,三种 padding 的上限分别为 190 / 214 / 245 字节,不是字符数。

10. RSA 加密:rsaEncrypt

rsaEncrypt({
  data: JSON.stringify({ message: '你好' }),
  dataEncoding: 'utf8',
  publicKey: serverPublicKeyPEM,
  padding: 'oaepSHA256',
  chunkMode: 'singleBlock',
  outputEncoding: 'base64',
  success: (res) => {
    // res.data 是密文,可交给持有配对私钥的服务端解密。
  },
  fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
})
参数 类型 必填 默认值 说明
data string 是 — 待加密明文;JSON 先转字符串;跨端请传非空数据,HarmonyOS 不接受空明文
dataEncoding string 否 utf8 明文编码:utf8 / base64 / hex
publicKey string 是 — 接收方完整公钥 PEM 或 DER Base64,不是文件路径
padding string 否 oaepSHA256 oaepSHA256 / oaepSHA1 / pkcs1,必须匹配服务端
chunkMode string 否 singleBlock singleBlock:超长报错;chunked:按单块上限分块加密,服务端必须支持同一规则
outputEncoding string 否 base64 密文输出编码:base64 / hex

成功结果:{ data: 密文, encoding: 输出编码 }。分块模式先拼接二进制密文块,再整体 Base64/Hex 编码,不是拼接每块 Base64 字符串。长 JSON 优先与服务端约定 AES 加密正文、RSA 加密 AES 密钥。

公钥支持 BEGIN PUBLIC KEY(SPKI)、BEGIN RSA PUBLIC KEY(PKCS#1)。padding 中 oaepSHA256 表示 OAEP-SHA256,oaepSHA1 表示 OAEP-SHA1,pkcs1 表示 PKCS#1 v1.5。OAEP 的 MGF1 摘要与 padding 摘要一致,label 为空;不支持自定义 MGF1/label。

11. RSA 解密:rsaDecrypt

示例中的 ciphertextBase64 为加密返回的密文,clientPrivateKeyPEM 为与加密公钥配对的完整私钥文本。

rsaDecrypt({
  data: ciphertextBase64,
  dataEncoding: 'base64',
  privateKey: clientPrivateKeyPEM,
  padding: 'oaepSHA256',
  chunkMode: 'singleBlock',
  outputEncoding: 'utf8',
  success: (res) => { console.log(res.data) },
  fail: (err) => { uni.showToast({ title: err.errMsg, icon: 'none' }) }
})
参数 类型 必填 默认值 说明
data string 是 — RSA 密文;chunked 时传拼接后整体编码的密文
dataEncoding string 否 base64 密文编码:utf8 / base64 / hex,通常与加密结果 encoding 一致
privateKey string 是 — 配对私钥 PEM 或 DER Base64,不是公钥、证书或文件路径
padding string 否 oaepSHA256 oaepSHA256 / oaepSHA1 / pkcs1,必须与加密一致
chunkMode string 否 singleBlock singleBlock / chunked,必须与加密一致
outputEncoding string 否 utf8 明文输出编码:utf8 / base64 / hex;二进制内容选 base64 或 hex

成功结果:{ data: 解密后的明文, encoding: 输出编码 }。分块任一块失败则整个调用失败。

私钥支持未加密的 BEGIN PRIVATE KEY(PKCS#8)、BEGIN RSA PRIVATE KEY(PKCS#1)。不支持带密码的私钥、BEGIN CERTIFICATE 证书和 OpenSSH 格式。只持有服务端公钥不能解密服务端公钥加密的数据。

更多好用插件推荐

隐私、权限声明

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

无

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

插件不采集任何数据

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

无