使用密码在Linux上运行时,SQLite会引发“ EntryPointNotFoundException:sqlite3_key”异常

时间:2019-01-07 23:29:26

标签: .net linux system.data.sqlite

我们有一个运行在.net 4.5下Windows桌面上的现有应用程序。我们使用带有密码的System.Data.SQLite来加密数据库文件。我们一直在努力修改应用程序,使其可以在Windows,Linux和Mac上跨平台运行。

我已经能够使用these指令来编译本机libSQLite.Interop.so库。只要未输入密码,我的测试程序就可以在Windows和Linux上运行。当我在连接字符串中包含密码时,在Windows中运行可以按预期运行,但是在Linux上运行会导致异常。我的测试代码是F#脚本:

#r "System.Data.SQLite.dll"

open System
open System.Data.SQLite

let dbFile = @"test.db"
let pw = "this is my super secure password"
let cnBuilder = SQLiteConnectionStringBuilder()
cnBuilder.DataSource <- dbFile
cnBuilder.Password <- pw

let cn = new SQLiteConnection(cnBuilder.ToString())
cn.Open()
...

引发此异常:

System.EntryPointNotFoundException: sqlite3_key
  at (wrapper managed-to-native) System.Data.SQLite.UnsafeNativeMethods.sqlite3_key(intptr,byte[],int)
  at System.Data.SQLite.SQLite3.SetPassword (System.Byte[] passwordBytes) [0x0000b] in <226287aa71b9481b9dd405c36cfaba76>:0 
  at System.Data.SQLite.SQLiteConnection.Open () [0x005c5] in <226287aa71b9481b9dd405c36cfaba76>:0 
  at <StartupCode$FSI_0001>.$FSI_0001.main@ () [0x00041] in <d78f800532b445c4abcca81cff853dd6>:0 
  at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke(System.Reflection.MonoMethod,object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0003b] in <7b0d87324cab49bf96eac679025e77d1>:0

我假设System.Data.SQLite源代码将包含相同的加密逻辑,而不管它在何处编译,因此我对为什么此方法不起作用感到困惑。是否需要包含更多的编译器标志才能启用加密,还是编译库的系统是否需要其他依赖项?请帮忙。

1 个答案:

答案 0 :(得分:1)

经过进一步研究,我发现非Windows平台的加密为not supported

推荐的解决方案是使用支持加密的implimentation并将其自己包含在项目中。可以找到另一种方法here