无法在.NET4中加密/解密SQLite数据库

时间:2011-12-16 14:23:31

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

我在Windows 7 x64上运行Visual Studio 2010。我正在编写的应用程序应该在所有平台上运行(AnyCPU)。如果我使用System.Data.SQLite.dll x86版本(sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.77.0.zip)或x64,我可以加密/解密数据库文件一个(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”的入口点。     Source = System.Data.SQLite TypeName =“”     堆栈跟踪:

         
   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   消息=文件已打开   这不是数据库文件文件加密或不是数据库
  Source = System.Data.SQLite ErrorCode = -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()          在C:\ SQLiteTest \ Database.cs中的SQLiteTest.Database.GetAllLanguages()中:第216行

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

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

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

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

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