无法在SQLite的Connection String中提供密码

我使用SQLite和Entity Framework。

我使用以下代码创建数据库:

class MyContext : DbContext { // DbSets, OnModelCreating(), etc. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Data Source=c:\\test.db"); } } //this is in my test method using (var db = new MyContext()) { db.Database.EnsureCreated(); } 

上面的代码有效。 数据库被创建。 但我想通过在连接字符串中提供密码来加密数据库:

 optionsBuilder.UseSqlite("Data Source=c:\\test.db;Password=mypassword"); 

在这种情况下,在EnsureCreated之后,我会遇到exception

System.Data.dll中发生类型为“System.ArgumentException”的未处理exception附加信息:不支持关键字:’password’。

使用密码有什么问题? 如何加密SQLite数据库?

根据这个答案保护EntityFramework Core Application使用的SQLite数据库

EF Core使用Microsoft.Data.Sqlite,它目前不支持开箱即用的加密。 请参阅https://github.com/aspnet/Microsoft.Data.Sqlite/issues/184 。 您可以使用SQLite扩展自己添加加密。

在提供的GitHub链接中,还有其他链接可供选择

Microsoft.Data.Sqlite中的加密

“纯”,开源sqlite3.dll不支持加密。 还有其他实现,包括许可和未许可。 对于我的解决方案,我使用了GitHub的rindeal / SQLite3-Encryption项目

我的解决方案

  1. 下载编译的二进制文件
  2. 将sqlite3.dll复制到BIN文件夹
    • 将DLL添加到Visual Studio中的项目
    • 将复制设置为输出目录 – 始终复制
  3. 在上下文的构造函数中使用此代码:

     string password; var connection = Database.GetDbConnection(); connection.Open(); using (var command = connection.CreateCommand()) { command.CommandText = $"PRAGMA key='{password}';"; command.ExecuteNonQuery(); } 

我找到了一个不涉及在BIN文件夹中复制dll的解决方案。

看看吧 。

我已经使用了Tschareck发布的实现:

  private const string Password = "1234"; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var conn = new SqliteConnection(@"Data Source=test.db;"); conn.Open(); using (var command = conn.CreateCommand()) { command.CommandText = $"PRAGMA key = '{Password}';"; command.ExecuteNonQuery(); } optionsBuilder.UseSqlite(conn); } 

并设法将密码输入我的解决方案,解决方案工作正常,但我有另一个问题 – 我无法使用该密码打开数据库(我使用DB浏览器的SQL浏览器)(当我点击“确定”密码被删除和什么都没发生):

printScreen数据库浏览器