通用Windows应用SQLite加密问题:.NET Standard库能否读取加密数据库?
如何在.NET Standard库的EF Core中读取加密的SQLite数据库
当然可以实现!你遇到的Sqlite26: file is encrypted or not a database file错误,大多是因为加密配置不匹配或者使用了不支持加密的SQLite驱动导致的。下面是一步步的解决方案:
1. 使用支持加密的SQLite Provider
默认的Microsoft.EntityFrameworkCore.Sqlite并不自带加密支持,你需要改用基于SQLCipher的第三方驱动。最常用的是SQLitePCLRaw.bundle_e_sqlcipher,它完全支持SQLite数据库加密,且兼容.NET Standard。
先安装对应的NuGet包:
# 使用.NET CLI dotnet add package SQLitePCLRaw.bundle_e_sqlcipher # 或者Package Manager Console Install-Package SQLitePCLRaw.bundle_e_sqlcipher
2. 在EF Core上下文配置加密密码
安装好驱动后,你需要在DbContext的OnConfiguring方法中指定加密密码。有两种常用方式:
方式一:直接通过UseSqlCipher扩展方法
using Microsoft.EntityFrameworkCore; public class YourDbContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var dbPath = "path/to/your/database.db"; var connectionString = $"Data Source={dbPath};"; optionsBuilder.UseSqlite(connectionString, sqliteOptions => { // 这里替换成你的数据库密码 sqliteOptions.UseSqlCipher("YourStrongEncryptionPassword"); }); } // 你的DbSet定义... }
方式二:手动执行PRAGMA key命令
如果需要更灵活的控制,可以在数据库连接打开后手动执行密码验证命令:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var connectionString = "Data Source=your_database.db;"; optionsBuilder.UseSqlite(connectionString); } public override int SaveChanges() { // 在首次连接时执行密码验证 var connection = Database.GetDbConnection(); if (connection.State != System.Data.ConnectionState.Open) connection.Open(); using (var command = connection.CreateCommand()) { command.CommandText = "PRAGMA key='YourStrongEncryptionPassword';"; command.ExecuteNonQuery(); } return base.SaveChanges(); }
3. 排查常见错误原因
你遇到的加密/数据库文件错误,通常是以下原因之一:
- 密码不匹配:确保读取时使用的密码和加密数据库时完全一致(注意大小写、特殊字符)。
- 驱动不兼容:如果数据库是用其他工具(比如SQLCipher命令行)加密的,要确认加密算法和SQLitePCLRaw使用的一致。
- 版本冲突:确保
Microsoft.EntityFrameworkCore.Sqlite和SQLitePCLRaw系列包的版本匹配,避免因版本差异导致的兼容性问题。
4. 额外注意事项
- .NET Standard兼容性:SQLitePCLRaw.bundle_e_sqlcipher支持.NET Standard 2.0及以上版本,只要你的库满足这个要求就可以正常使用。
- 密码安全:绝对不要硬编码密码!建议从配置文件、环境变量或者密钥管理服务中读取密码。
内容的提问来源于stack exchange,提问作者Vishnu s
相关产品推荐
相关产品推荐

