Compartilhar via


Criptografia

O SQLite não dá suporte à criptografia de arquivos de banco de dados por padrão. Em vez disso, pode ser preciso usar uma versão modificada do SQLite, como SEE, SQLCipher, SQLiteCrypt ou wxSQLite3. Este artigo demonstra o uso de um build de software livre sem suporte do SQLCipher, mas as informações também se aplicam a outras soluções, pois geralmente seguem o mesmo padrão.

Instalação

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

Para obter mais informações sobre como usar uma biblioteca nativa diferente para criptografia, confira Versões personalizadas do SQLite.

Especificar a chave

Para habilitar a criptografia em um novo banco de dados, especifique a chave usando a palavra-chave da cadeia de conexão Password. Use SqliteConnectionStringBuilder para adicionar ou atualizar o valor da entrada de usuário e evitar ataques de injeção de cadeia de conexão.

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

Importante

A Microsoft recomenda usar o fluxo de autenticação mais seguro disponível. Se você estiver se conectando ao SQL do Azure, as Identidades gerenciadas para recursos do Azure é o método de autenticação recomendado.

Dica

O método para criptografar e descriptografar bancos de dados existentes varia conforme a solução que você está usando. Por exemplo, você precisa usar a função sqlcipher_export() no SQLCipher. Verifique a documentação da solução para obter detalhes.

Rechavear o banco de dados

Se você quiser alterar a chave de um banco de dados criptografado, emita uma instrução PRAGMA rekey.

Infelizmente, o SQLite não dá suporte a parâmetros em instruções PRAGMA. Em vez disso, use a função quote() para evitar a injeção de 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();