SQLite加密在平台之间有所不同

Woo*_*ody 5 c c# java sqlite

我从源代码构建了几个dll.它们主要来自同一个源,sqlite-3.6.22,Open SSL 0.9.8和sqlcipher.

我构建两个的原因是我需要一个用于处理C++项目,一个用作java的JDBC驱动程序(所以java jni dll).

现在我有两个DLL,我可以用C++和C#编写和创建数据库(使用C语言),在java中也是如此.这两个响应正如我所料,你可以打开它们,如果你给出正确的密码,它会失败,如果你给错了,等等.理论上应该是sqlcipher的默认值,它是硬编码到aes-256-cbc .但是,我无法打开一个用另一个制作的数据库.我可以在SQLite3 Management studio中打开一个用c版本创建的数据库,但是只有在我选择了RSA的密码时,我才能打开在java中创建的其他任何东西.

另一件事是,如果我使用c数据库创建两个具有相同内容的数据库,则它们是字节相同的字节,而java则不是.

我确信我做了一些明显错误的事情,但我真的看不到它 - 据我所知,java工作正常(因某些原因更容易调试).

Woo*_*ody 1

离开了一段时间后,因为这很令人沮丧,今天又回来了。调试 sqlite3.dll 给了我答案。

如果您是通过 Java 中的 JDBC 访问它,则没有 byte[] 密码的密钥函数,因此需要通过语句中的 PRAGMA key='' 输入密码。从文档看来,这些是等效的,如果您需要二进制密钥,可以对它进行十六进制编码并将“x”放在前面。所以在java中我有:

PRAGMA key="x'899e7c6475756d887a759a93a0a3979a62827e85919898a49394a29c7b88aa8a"
Run Code Online (Sandbox Code Playgroud)

而在 C# 中,我在字节数组中使用这些二进制数字。

事实证明,该字符串实际上被用作密码,即 42 个字符的密码。

因此,我可以使用 pragma 或 key 方法在 java 中创建一个数据库并在 C# 中读取它,反之亦然,只要我不需要二进制密码,而我不能在 java 中使用二进制密码。

猜猜我需要哪种方法!