無法在SQLite的Connection String中提供密碼

c# entity-framework entity-framework-core sqlite

我使用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之後,我會遇到異常

System.Data.dll中發生類型為“System.ArgumentException”的未處理異常附加信息:不支持關鍵字:'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();
    }
    


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow