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
相关产品推荐
相关产品推荐

