暗号化

SQLite では、既定により、データベース ファイルの暗号化はサポートされません。 代わりに、修正した SQLite バージョンの SEESQLCipherSQLiteCryptwxSQLite3 などを使用する必要があります。 この記事では、SQLCipher のサポートされていないオープンソース ビルドの使用について説明しますが、他のソリューションにも当てはまります。これらも一般的に同じパターンに従っているためです。

インストール

dotnet remove package Microsoft.Data.Sqlite
dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.bundle_e_sqlcipher

暗号化に別のネイティブ ライブラリを使用する場合の詳細については、「カスタム SQLite のバージョン」を参照してください。

キーを指定する

新しいデータベースで暗号化を有効にするには、Password 接続文字列キーワードを使用してキーを指定します。 SqliteConnectionStringBuilder を使用して、ユーザー入力の値を追加または更新し、接続文字列のインジェクション攻撃を回避します。

var connectionString = new SqliteConnectionStringBuilder(baseConnectionString)
{
    Mode = SqliteOpenMode.ReadWriteCreate,
    Password = password
}.ToString();

ヒント

既存のデータベースを暗号化および暗号化解除する方法は、使用しているソリューションによって異なります。 たとえば、SQLCipher では sqlcipher_export() 関数を使用する必要があります。 詳細については、ソリューションのドキュメントを参照してください。

データベースのキーを更新する

暗号化されたデータベースのキーを変更する場合は、PRAGMA rekey ステートメントを実行します。

ただし、SQLite では PRAGMA ステートメントのパラメーターはサポートされません。 代わりに、quote() 関数を使用して、SQL インジェクションを防止してください。

var command = connection.CreateCommand();
command.CommandText = "SELECT quote($newPassword);";
command.Parameters.AddWithValue("$newPassword", newPassword);
var quotedNewPassword = (string)command.ExecuteScalar();

command.CommandText = "PRAGMA rekey = " + quotedNewPassword;
command.Parameters.Clear();
command.ExecuteNonQuery();