Condividi tramite


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