平台间SQLite加密不同

5
我已经从源代码构建了几个dll文件,它们主要来自相同的源码sqlite-3.6.22,OpenSSL 0.9.8和sqlcipher。
我之所以构建两个是因为我需要一个用于与C++项目一起使用,另一个作为Java的JDBC驱动程序(因此是Java JNI dll)。
现在我有了这两个DLL文件,我可以使用C++和C#(使用C版本)编写和创建数据库,并且可以使用Java完成相同的操作。这两个都按照我的预期响应,如果您提供正确的密码,您可以打开它们,如果您提供错误的密码,则会失败等等。理论上,这两个应该是sqlcipher的默认值,硬编码为aes-256-cbc。
然而,我无法使用其中一个打开由另一个创建的数据库。我可以在SQLite3管理工具中打开使用C版本创建的数据库,但只有在选择RSA密码时才能打开Java创建的那一个。
另外一件事是,如果我使用C数据库制作两个内容相同的数据库,则它们的每个字节都是相同的,而Java的则不同。
我确信我做错了一些明显的事情,但我真的看不到它 - 就我所知,Java的那个正常工作(由于某种原因更容易调试)。

请原谅“differening”这个可怕的错别字! - Woody
不确定我的问题是否相关。您能否使用Java创建两个未加密的数据库,这两个数据库是逐字节相同的? - Mike Sherrill 'Cat Recall'
我已经修复了您的标题拼写错误! - CraigTP
1个回答

1

因为这个问题让我很沮丧,所以我离开了一段时间,今天回来继续解决。

通过调试sqlite3.dll,我找到了答案。

如果你是通过Java中的JDBC访问它,你没有byte[]密码的关键函数,所以需要通过PRAGMA key=''语句输入密码。从文档中看来,这些是等效的,如果你需要一个二进制密钥,你需要将其十六进制编码并在前面加上"x'"。所以在Java中,我有:

PRAGMA key="x'899e7c6475756d887a759a93a0a3979a62827e85919898a49394a29c7b88aa8a"

然而在 C# 中,我正在使用字节数组中的二进制数位。

结果发现该字符串被当做密码使用,是一个由42个字符组成的密码。

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

猜猜我需要哪种方法!


我现在和你处于同样的境地。你是如何创建一个可通过JDBC和C#访问的加密sqlite数据库的? - Stephen Vernyi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接