Шифрование SQLite на разных платформах отличается - PullRequest
5 голосов
/ 07 января 2011

Я построил пару DLL из источника. Они в основном из одного источника, sqlite-3.6.22, Open SSL 0.9.8 и sqlcipher.

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

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

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

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

1 Ответ

1 голос
/ 04 февраля 2011

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

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

PRAGMA key="x'899e7c6475756d887a759a93a0a3979a62827e85919898a49394a29c7b88aa8a"

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...