You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何对基于Sqlite3的.bytes后缀数据库文件进行加密

Unity 环境下 Sqlite3 .bytes 数据库加密实现方案

你当前引入的默认编译版本sqlite3.dll是不带官方加密能力的,Mono.Data.Sqlite本身也没有内置加密逻辑,以下是两种可直接落地的实现方案:


方案1:替换带加密模块的Sqlite3依赖(推荐,性能无损耗)

这个方案不需要改动现有数据库读写逻辑,是生产环境最常用的方案:

  • 首先将Plugins目录下的原生sqlite3.dll替换为集成SQLCipher加密模块的编译版本,注意要匹配项目目标平台架构(Windows x86/x64、Android ARM、iOS ARM等),不同架构的依赖文件要放到Plugins文件夹下对应的平台子目录中,避免打包时报错。
  • 所有数据库操作逻辑和之前一致,只需要修改数据库连接字符串,加入密码参数即可:
using Mono.Data.Sqlite;
using System.Data;
using System.IO;
using UnityEngine;

// 注意:StreamingAssets下的.bytes文件是只读的,必须先拷贝到可读写路径再操作
string persistentDbPath = Path.Combine(Application.persistentDataPath, "gameDB.bytes");
// 连接字符串新增Password字段即可启用加密
string connectionString = $"Data Source={persistentDbPath};Version=3;Password=你的自定义加密密钥;";

using (IDbConnection dbConn = new SqliteConnection(connectionString))
{
    dbConn.Open();
    // 后续增删改查逻辑和未加密数据库完全一致
}
  • 如果要给已经存在的未加密旧库加密码,先以无密码连接打开原数据库,执行以下命令即可完成全库加密转换:
using (var cmd = dbConn.CreateCommand())
{
    cmd.CommandText = "PRAGMA rekey = '你设置的新密码';";
    cmd.ExecuteNonQuery();
}

转换完成后,后续所有连接必须传入正确密码才能打开库,否则会直接报文件损坏错误。


方案2:自定义AES全文件加解密(无需替换DLL,适合小型数据库)

如果不想替换现有Sqlite依赖,可以对数据库文件本身做对称加解密,缺点是每次读写都要处理全文件流,仅适合体积在10MB以内的小型数据库:

  • 首次启动时,将存放在项目目录中的原始.bytes数据库文件读取为二进制流,用AES算法加密后写入Application.persistentDataPath目录,原始只读路径下的文件仅做首次初始化的备份用。
  • 需要操作数据库时,先读取持久化路径下的加密二进制流,解密后写入临时内存流或临时文件,再用Sqlite连接打开解密后的内容执行读写操作。
  • 操作完成后,将修改后的数据库内容重新用AES加密,覆盖持久化路径下的加密文件,及时删除临时解密的文件,避免明文数据残存在本地。
  • 注意:加密密钥不要硬编码在C#脚本中,建议拆分字符串、加混淆后存储,避免被反编译直接窃取。

常见踩坑说明

  • Unity中StreamingAssets目录下的文件在移动端(Android/iOS)是存放在压缩安装包内的,没有直接写入权限,所有加密、修改操作必须在拷贝到Application.persistentDataPath可读写路径后再执行。
  • 项目的Api Compatibility Level要设置为.NET Framework版本,不要选择.NET Standard子集,否则会出现Mono.Data.Sqlite依赖缺失的报错。
  • 加密后的数据库无法用普通Sqlite可视化工具直接打开,必须输入对应密码才能访问,这是加密生效的正常表现,不是文件损坏。

内容的提问来源于stack exchange,提问作者Avgust Kuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 16:15:53