Cifrado
SQLite no permite cifrar archivos de base de datos de forma predeterminada. En su lugar, hay que usar una versión modificada de SQLite, como SEE, SQLCipher, SQLiteCrypt o wxSQLite3. En este artículo se explica cómo usar una versión de código abierto y no compatible de SQLCipher, pero esta información es igualmente válida en otras soluciones, ya que básicamente siguen el mismo patrón.
Instalación
dotnet remove package Microsoft.Data.Sqlite
dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.bundle_e_sqlcipher
Para más información sobre cómo usar otra biblioteca nativa para el cifrado, vea Versiones personalizadas de SQLite.
Especificación de la clave
Para permitir el cifrado en una nueva base de datos, especifique la clave por medio de la palabra clave de cadena de conexión Password
. Use SqliteConnectionStringBuilder para agregar o actualizar el valor de la entrada del usuario y evitar ataques de inyección de cadenas de conexión.
var connectionString = new SqliteConnectionStringBuilder(baseConnectionString)
{
Mode = SqliteOpenMode.ReadWriteCreate,
Password = password
}.ToString();
Importante
Microsoft recomienda usar el flujo de autenticación más seguro disponible. Si se conecta a Azure SQL, el método de autenticación recomendado es Identidades administradas para recursos de Azure.
Sugerencia
El método para cifrar y descifrar las bases de datos existentes varía en función de la solución que esté usando. Por ejemplo, debe usar la función sqlcipher_export()
en SQLCipher. Consulte la documentación de la solución para más información.
Generación de una nueva clave de base de datos
Si quiere cambiar la clave de cifrado de una base de datos, emita una instrucción PRAGMA rekey
.
Desafortunadamente, SQLite no admite el uso de parámetros en las instrucciones PRAGMA
. En su lugar, use la función quote()
para evitar la inyección de código 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();