更新记录
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 格式。只持有服务端公钥不能解密服务端公钥加密的数据。
更多好用插件推荐
- 高德定位连续定位后台定位保活定位
- 百度汽车摩托车导航插件
- 百度鹰眼轨迹插件支持后台采集、保活
- 百度定位插件、连续定位、保活、坐标系转换、支持双端
- 计步器插件,支持Android、iOS双端
- uts经典蓝牙插件、蓝牙电子秤
- 获取唯一标识、ServiceID、卸载更新不变iOS+Android
- Android经典蓝牙
- 华为ScanKit统一扫码插件支持iOS+Android原生插件
- 【华为扫码】统一扫码插件支持多码连续扫码支持半屏扫码uts插件iOS+Android+HarmonyOS
- 截屏、录屏、防截屏、录屏iOS、Android
- 人脸采集插件 最新百度SDK 离线人脸采集、活体检测
- 页面截长图、截取WebView内容,生成长截图Android+iOS
- Android无预览拍照、录制、静默拍照、静默录制、抓拍插件支持
- uni高德地图功能拓展地图截图
- 科大讯飞离线合成插件支持iOS、android
- iOS保活Android保活鸿蒙保活定位插件系统定位
- 高德定位、猎鹰轨迹插件
- 海康威视综合安防平台视频播放插件
- 支持NFC读写功能检测支持Android iOS HarmonyOS
- 自定义相机
- VLC视频播放器
- 安卓苹果OCR纯离线识别无第三方识别
- Android iOS HarmonyOS OCR纯离线识别身份证银行卡车牌VIN发票

收藏人数:
购买源码授权版(
试用
使用 HBuilder 导入示例项目
赞赏(1)
下载 649
赞赏 16
下载 12687886
赞赏 1956
赞赏
京公网安备:11010802035340号