2011-01-07 54 views
5

我已经从源代码构建了几个dll。他们主要来自同一个源码,sqlite-3.6.22,Open SSL 0.9.8和sqlcipher。不同平台之间的SQLite加密

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

现在我有两个DLL,我可以在C++和C#中编写和创建数据库(使用C),而在java中也是一样。这两种响应都如我所料,如果您提供正确的密码,您可以打开它们,如果您输入错误的密码,则会失败。 这两个理论上都应该是sqlcipher的默认设置,它被硬编码为aes-256- CBC。 但是,我无法打开一个与另一个做的数据库。我可以在SQLite3 Management Studio中打开使用c版本创建的数据库,但是只有当我将密码与RSA选中后,我才能打开在java中创建的任何其他数据库。

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

我相信我做的东西很明显错了,但是我真的不能看到它 - 据我可以看到Java的一个工作正常(更容易调试出于某种原因)。

+0

请原谅'不同'的可怕错字! – Woody 2011-01-10 09:14:36

+0

不确定我的问题是否相关。您可以使用Java创建两个字节一致的未加密数据库吗? – 2011-01-17 14:36:40

回答

1

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

如果要通过JDBC在Java中访问它,你不必为一个byte []密码键的功能,所以需要通过在一份声明PRAGMA键=“”输入密码。从文档看来,这些是等同的,如果你需要一个二进制密钥,你可以用十六进制编码,并把“x”放在前面。所以在Java我有:

PRAGMA key="x'899e7c6475756d887a759a93a0a3979a62827e85919898a49394a29c7b88aa8a" 

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

原来,该字符串被字面上用作密码,是一个42个字符的密码。

所以我可以在java中创建一个数据库并在C#中读取数据库,反之亦然,只要我不想使用二进制密码,我不能在java中使用该密码。

猜猜我需要哪种方法!