加密

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

重要

Microsoft 建议使用最安全的可用身份验证流。 如果要连接到 Azure SQL,建议使用 Azure 资源的托管标识这种身份验证方法。

提示

加密和解密现有数据库的方法因你使用的解决方案而异。 例如,你需要在 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();