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

通用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:03:53