【发布时间】:2021-01-30 14:08:18
【问题描述】:
我正在编写一个 .NET Core 3.1 应用程序,该应用程序依赖于另一个试图将日志数据存储到 SQLite 数据库的库 (Serilog.Sinks.SQLite)。不幸的是,Serilog.Sinks.SQLite 不支持通过SQLiteConnectionStringBuilder.Password 属性(您提供给SQLiteConnection 构造函数)将密码传递给System.Data.SQLite ) 我真的很喜欢这个功能。
Serilog.Sinks.SQLite用来连接数据库的代码如下:
private SQLiteConnection GetSqLiteConnection()
{
var sqlConString = new SQLiteConnectionStringBuilder
{
DataSource = _databasePath,
JournalMode = SQLiteJournalModeEnum.Memory,
SyncMode = SynchronizationModes.Normal,
CacheSize = 500,
PageSize = (int)MaxSupportedPageSize,
MaxPageCount = (int)(_maxDatabaseSize * BytesPerMb / MaxSupportedPageSize)
}.ConnectionString;
var sqLiteConnection = new SQLiteConnection(sqlConString);
sqLiteConnection.Open();
return sqLiteConnection;
}
StackOverflow 上有许多关于使用 SQLite 加密的类似帖子,非常令人信服地指出,System.Data.SQLite 确实支持数据库的加密/密码保护。但是,这与我的经验不符。
我获取了Serilog.Sinks.SQLite source 的副本,试图对其进行修改以支持指定密码。这似乎应该很容易通过在上述代码中添加以下内容(在连接字符串中指定 Password 属性)来完成:
MaxPageCount = (int)(_maxDatabaseSize * BytesPerMb / MaxSupportedPageSize),
Password = "mypasswordhere"
}.ConnectionString;
不幸的是,这不起作用,并导致在启动时引发异常并显示以下消息:
发生异常:CLR/System.Data.SQLite.SQLiteException An 'System.Data.SQLite.SQLiteException' 类型的未处理异常 在 LoggingWebApi.dll 中发生:'SQL 逻辑错误无法使用“密码” 连接字符串属性:库不是使用加密构建的 支持,请参阅“https://www.sqlite.org/see”了解更多信息'
这里最让我困惑的是我发现的其他帖子的数量声称 System.Data.SQLite 支持此密码 并且 . NET Framework 4.6 应用程序来自我公司的另一个团队,它正在使用 System.Data.SQLite.dll(虽然是旧版本 1.0.111.0),并且这种密码行为对他们来说很好。
我的代码以netcoreap3.1 为目标,而我对Serilog.Sinks.SQLite 的依赖以netstandard2.0 为目标,所以这是我看到的一个明显区别。在我修改后的Serilog.Sinks.SQLite 代码版本中,我引用System.Data.SQLite.Core 如下(通过otnet add package System.Data.SQLite.Core --version 1.0.113.1 添加):
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.113.1" />
.NET Core 3.1 或 .NET Standard 2.0 是否会导致 System.Data.SQLite.Core 不支持 Password 连接字符串属性,就像其他人似乎认为它支持的那样?
我想我的问题可能是在 Linux 上运行,所以我尝试在我的 Windows 上运行,但它产生了同样的错误。
我确实发现另一篇文章引用了一种可能有用的方法,但这个示例没有使用System.Data.SQLite.Core,而是使用SQLitePCLRaw.bundle_e_sqlcipher,我宁愿避免重写所有Serilog.Sinks.SQLite 使用不同 SQLite 客户端的代码:https://github.com/paragpkulkarni/SQLiteEncryptionUsingEFCore
【问题讨论】:
-
我找到了这个github线程:How to make SQLite database password protected,我们不确定Serilog.Sinks.SQLite包是否支持密码加密数据库,您也可以联系Serilog.Sinks.SQLite或post评论以验证它。如果不支持,你必须use SQLite encrypted databases using Entity Framework Core (EFCore)
-
我做了更多测试,发现如果我制作一个 Windows .NET Framework (4.7.2) 应用程序并从 NuGet (nuget.org/packages/System.Data.SQLite.Core) 引用 System.Data.SQLite.Core,它也不支持加密。因此,NuGet 上向公众开放的版本似乎不支持加密。
标签: asp.net-core serilog system.data.sqlite