SQLiteの接続文字列にパスワードを提供できません

c# entity-framework entity-framework-core sqlite

質問

Entity FrameworkでSQLiteを使用しています。

次のコードでDBを作成します。

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();
}

上記のコードは動作します。 DBが作成されます。しかし、私は接続文字列でパスワードを提供することによってDBを暗号化したい:

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

この場合、 EnsureCreatedが呼び出された後、例外が発生します。

System.Data.dllに「System.ArgumentException」型の未処理の例外が発生しました。追加情報:キーワードはサポートされていません:「パスワード」。

パスワードを使用すると何が問題になりますか?そのSQLiteデータベースをどのように暗号化できますか?

受け入れられた回答

この回答によると、EntityFramework Core Applicationで使用されるSQLiteデータベースを保護する

EFコアでは、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フォルダーにコピーします
    • Visual StudioでプロジェクトにDLLを追加します。
    • コピーを出力ディレクトリに設定 - 常にコピー
  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
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ