Crittografia
SQLite non supporta la crittografia dei file di database per impostazione predefinita. È invece necessario usare una versione modificata di SQLite, ad esempio SEE, SQLCipher, SQLiteCrypt o wxSQLite3. Questo articolo illustra l'uso di una compilazione open source non supportata di SQLCipher, tuttavia le informazioni si applicano anche ad altre soluzioni poiché generalmente seguono lo stesso modello.
Installazione
dotnet remove package Microsoft.Data.Sqlite
dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.bundle_e_sqlcipher
Per altre informazioni sull'uso di una libreria nativa diversa per la crittografia, vedere Versioni di SQLite personalizzate.
Specificare la chiave
Per abilitare la crittografia in un nuovo database, specificare la chiave usando la parola chiave della stringa di connessione Password
. Usare SqliteConnectionStringBuilder per aggiungere o aggiornare il valore dall'input dell'utente ed evitare attacchi di inserimento della stringa di connessione.
var connectionString = new SqliteConnectionStringBuilder(baseConnectionString)
{
Mode = SqliteOpenMode.ReadWriteCreate,
Password = password
}.ToString();
Importante
Microsoft consiglia di usare il flusso di autenticazione più sicuro disponibile. Se ci si connette ad Azure SQL, le Identità gestite per le risorse Azure sono il metodo di autenticazione consigliato.
Suggerimento
Il metodo per crittografare e decrittografare i database esistenti varia a seconda della soluzione in uso. Ad esempio, è necessario usare la funzione sqlcipher_export()
in SQLCipher. Per informazioni dettagliate, vedere la documentazione della soluzione.
Reimpostazione del database
Se si vuole modificare la chiave di un database crittografato, eseguire un'istruzione PRAGMA rekey
.
Sfortunatamente, SQLite non supporta i parametri nelle istruzioni PRAGMA
. Usare invece la funzione quote()
per impedire l'inserimento 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();