插件数据管理
数据目录、storage.json 文件级加密、导出文件、备份恢复
插件数据管理
数据目录
每个插件的全部数据位于 plugin_data/<pluginId>/:
plugin_data/<pluginId>/
├── storage.json # storage.* API 数据 —— 落盘即加密(YZHENC1 格式)
├── encrypted_storage.json # storage.encrypted.* 遗留 API 数据(AES-256-GCM)
├── exports/ # file.exportFile 导出的文件(含系统分享来源)
└── ... # file.write/writeBinary 创建的其他文件
- 覆盖安装(同 pluginId)不动此目录;卸载插件会删除整个目录,重要数据先导出
storage.json上限 10MB;大文件(图片/音视频)走file.writeBinary/file.exportFile,不要塞进键值存储
storage.json 文件级加密
storage.* 的所有数据在落盘时由宿主整文件加密(AES-256-GCM,YZHENC1: 前缀标识),
密钥来自托管密钥链,档位跟随权限页的「密码保护」开关:
| 密码保护 | 密钥包装 | 插件可用性 |
|---|---|---|
| 关(默认) | 设备 KEK 托管 | 免密可用,没设安全密码也加密 |
| 开 | 密码层托管 | 需解锁安全中心;锁定时 storage 调用返回 {error:'locked', locked:true} |
- 加密/解密对插件完全透明,插件只管
storage.set/get - 开启/关闭密码保护时宿主自动迁移存量数据(提示 → 字节进度条 → 完成确认), 迁移写盘走临时文件+改名,中断不损坏数据
备份与恢复
- 备份时
plugins/(插件本体)与plugin_data/(数据)目录整体随行,storage.json保持密文原样入包 - 插件数据密钥随
tool_keys.json一并携带(plugin:<id>动态白名单, 密钥受备份密码整体加密保护) - 恢复到新设备:数据与密钥自动重包到新设备 KEK——密码保护关闭的插件恢复后 免密可用;开启的插件需解锁安全中心后解密
- 恶意备份注入未知工具密钥会被白名单拒绝(
plugin:<uuid>形态动态放行)
导出文件(exports/)
file.exportFile 写入的文件位于 exports/ 子目录,行为约定:
- 写入即自动弹出系统分享面板(用户发给微信/QQ 或保存到系统文件)
file.list('exports')列出全部导出记录;file.share(name)再次分享;file.delete(name, 'exports')删除- 系统限制:沙箱目录无法用文件管理器直接打开,分享是取出文件的唯一途径
数据安全建议
- 敏感数据优先开启插件的「密码保护」(数据进密码档),而不是依赖设备档
- 不要在 storage 里存明文密码/令牌
- 数据量大时注意
storage.get('__all__')的内存占用(整文件读改写,上限 10MB)