在 .Net/C# 中加密 SQLite 数据库文件的最佳方法是什么?我正在使用 sqlite-dotnet2 包装器。
有像 SQLite Encryption Extension 和 SQLite Crypt 这样的工具,但两者都是非免费的,而我的项目是在 GPL 下。
我想到使用的简单方法是让 SQLite 处理临时文件,然后在程序退出时对其进行加密,并覆盖(清零)原始文件。明显的缺点是,如果程序崩溃(并且在运行时),则可以访问纯文本数据库。
有更好的方法来解决这个问题吗?我可以将加密流传递给包装器(而不是使用 SQLiteConnection.CreateFile)吗?
[编辑]也许我想太多了。在连接字符串中使用密码选项是否足够?在这种情况下,文件是否会被正确加密(或者是某种较弱的保护)?
我建议使用
System.Data.Sqlite
包装器,其中包括加密。它工作得很好,很容易使用,而且是一个完整的 ADO.Net 实现。您可以从 https://system.data.sqlite.org 获取包装器,开发人员在该论坛上描述了如何使用加密:https://web.archive.org/web/20100207030625/http ://sqlite.phxsoftware.com/forums/t/130.aspx。提示 - 您刚刚设置了密码属性。他还在论坛其他地方描述了如何使用 Microsoft Crypto API 进行加密。
我会尝试http://code.google.com/p/csharp-sqlite/,它是在 MIT 许可证下用 C# 重写 SQLite 3.6.16。我想调整它会很容易。
编辑:正如下面的注释中提到的,它还支持sqlcipher加密
更新:自从Google Code变为只读以来,该项目已转移到它自己的网站https://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
由于自
System.Data.SQLite
版本 1.0.113.0 起此解决方案不起作用,这里是作者使用 Microsoft.Data.SQLite.Core
和 SQLitePCLRaw.bundle_e_sqlcipher
的帖子的链接,并且它确实加密了数据库。
他甚至提供了带有 UWP 示例的源代码,但我已经在 .NET 6 中对其进行了测试,它应该适用于每种类型的项目。