【问题标题】:Cannot encrypt / decrypt SQLite database in .NET4无法在 .NET4 中加密/解密 SQLite 数据库
【发布时间】:2012-01-22 01:25:14
【问题描述】:

我在 Windows 7 x64 上运行 Visual Studio 2010。我正在编写的应用程序应该在所有平台(AnyCPU)上运行。如果我使用 x86 版本(sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.77.0.zip)或 x64 的 System.Data.SQLite.dll,我可以加密/解密数据库文件一个(sqlite-netFx40-static-binary-bundle-x64-2010-1.0.77.0.zip)。

我需要我的应用在 x86 和 x64 平台上运行(任何 CPU 项目构建设置)。我尝试安装 ADO.NET 4.0 Provider (SQLite-1.0.67.1-vs2010-net4-setup.exe)。我添加了引用(右键单击项目,添加引用,.NET 选项卡 -> System.Data.SQLite)并运行程序。如果我解密文件并尝试通过调用 ChangePassword("myPass") 进行加密,则会收到以下异常:

System.EntryPointNotFoundException 被捕获

消息=无法在 DLL“System.Data.SQLite.DLL”中找到名为“sqlite3_rekey”的入口点。 源=System.Data.SQLite 类型名称="" 堆栈跟踪:

   at System.Data.SQLite.UnsafeNativeMethods.sqlite3_rekey(IntPtr db, Byte[ key, Int32 keylen)
   at System.Data.SQLite.SQLite3.ChangePassword(Byte[ newPasswordBytes)
   at System.Data.SQLite.SQLiteConnection.ChangePassword(Byte[ newPassword)
   at System.Data.SQLite.SQLiteConnection.ChangePassword(String newPassword)
   at SQLiteTest.Database.Encrypt() in C:\SQLiteTest\Database.cs:line 166

另外,我尝试使用 SQLiteConnection 对象打开一个连接,但在两种不同的情况下我得到了两种不同的异常。 首先,如果文件被加密并且我没有在连接字符串中指定密码,我会得到:

System.Data.SQLite.SQLiteException 被捕获 消息=文件打开 不是数据库文件的文件被加密或不是数据库
源=System.Data.SQLite 错误代码=-2147467259 堆栈跟踪: 在 System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn, String strSql, SQLiteStatement previous,

UInt32 timeoutMS, String& strRemain) 在 System.Data.SQLite.SQLiteCommand.BuildNextCommand() 在 System.Data.SQLite.SQLiteCommand.GetStatement(Int32 索引) 在 System.Data.SQLite.SQLiteDataReader.NextResult() 在 System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd,CommandBehavior 行为) 在 System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior 行为) 在 System.Data.SQLite.SQLiteCommand.ExecuteNonQuery() 在 System.Data.SQLite.SQLiteConnection.Open() 在 SQLiteTest.Database.GetAllLanguages() 在 C:\SQLiteTest\Database.cs:line 216

其次,如果我将密码参数添加到连接字符串中,我会得到与上面类似的 System.EntryPointNotFoundException。

那么,有人知道在 AnyCPU 平台上的 C# 应用程序中使用加密 SQLite 数据库的可靠方法吗?

提前致谢!

【问题讨论】:

  • 只是好奇您在 .config 文件中是否有 2 个单独的设置/位置用于端点设置..?或者你是通过代码来操作这个..?
  • @DJKRAZE 我没有 .config 文件,它只是数据库的服务应用程序。一切都由代码完成。
  • 您可能需要展示如何使用程序集或服务的示例

标签: c# .net sqlite encryption system.data.sqlite


【解决方案1】:

以下解决方案有点脏,但它可能会起作用,我们没有使用加密数据库,所以我不是 100% 如果这对你有用。 我们为 x64 和 x86 下载了两个版本的 sqlite dll,并将它们放在不同的文件夹中。当我们手动加载程序集时,我们根据当前正在运行的平台应用程序手动加载它们(我们检查 IntPtr.Size ,从 .net 4 中有一个名为 Is64BitOperatingSystem 的环境类的属性)当我们手动加载程序集时,我们会获得连接实例

 var sqliteConnectionType = assembly.GetType("System.Data.SQLite.SQLiteConnection");
 (DbConnection)Activator.CreateInstance(sqliteConnectionType);

我们在项目中不使用对任何版本的 sqlite 的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多