加密
SQLite 在默认情况下不支持加密数据库文件。 而是需要使用修改后的 SQLite 版本,如 SEE、SQLCipher、SQLiteCrypt 或 wxSQLite3。 本文演示如何使用 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();