2011-01-07 3 views
5

Я построил несколько библиотек из источника. Они в основном из одного источника, sqlite-3.6.22, Open SSL 0.9.8 и sqlcipher.SQLite Шифрование, отличное от платформ

Причина, по которой я построил два, заключалась в том, что мне нужен был один для работы с проектом C++, а другой - как драйвер JDBC для java (так что java jni dll).

Теперь у меня есть две библиотеки DLL, я могу писать и создавать базы данных на C++ и C# (используя C один), и то же самое в java. Оба они отвечают так, как я ожидал, вы можете открыть их, если вы дадите правильный пароль, он терпит неудачу, если вы дадите неправильный и т. Д. Оба теоретически должны быть по умолчанию для sqlcipher, который жестко привязан к aes-256- CBC. Однако я не могу открыть базу данных, созданную с помощью одной с другой. Я могу открыть базу данных, сделанную с версией c в студии управления SQLite3, но только если я положу пароль с выбранным RSA, я не могу открыть тот, который был создан в java во всем, что у меня есть.

Другое дело, что если я создаю две базы данных с идентичным содержимым с базой данных c, они байт для байта идентичны, тогда как java - нет.

Я уверен, что делаю что-то не так, но я действительно не вижу его - насколько я могу видеть, что java работает нормально (проще отлаживать по какой-то причине).

+0

Извините за ужасную опечатку «differening», пожалуйста! – Woody

+0

Не уверен, имеет ли значение мой вопрос. Можете ли вы создать две незашифрованные базы данных с Java, которые побайтно идентичны? –

+0

Я исправил вашу опечатку! – CraigTP

ответ

1

Оставив это некоторое время, как это было довольно неприятно, и вернулся к нему сегодня. Отладка sqlite3.dll дает мне ответ.

Если вы обращаетесь к нему через JDBC в Java, у вас нет ключевых функций для байта [] password, поэтому вам нужно ввести пароль с помощью PRAGMA key = '' в инструкции. Из документации видно, что они эквивалентны, и если вам нужен двоичный ключ, вы можете закодировать его и поставить «x» впереди. Так что в java у меня было:

PRAGMA key="x'899e7c6475756d887a759a93a0a3979a62827e85919898a49394a29c7b88aa8a" 

, а в C# я использовал эти двоичные цифры в массиве байтов.

Оказывается, что строка используется в качестве пароля буквально, пароль с 42 символами.

Так что я могу создать базу данных в java и прочитать ее на C# и наоборот, используя методы прагмы или ключа, если мне не нужен двоичный пароль, который я не могу использовать в java.

Угадайте, какой метод мне нужен!

+0

Я сейчас в той же лодке, что и ты. Как вы создали зашифрованную базу данных sqlite, доступную как через JDBC, так и C#? –