Подтвердить что ты не робот

Кто-нибудь успешно использовал пароль в базе данных sqlite в Monotouch?

У меня есть приложение Monotouch, в котором используется база данных sqlite. Я хочу зашифровать базу данных, поэтому я делаю это:

_mainConnection = new SqliteConnection("Uri="+finalDB);
_mainConnection.Open();
_mainConnection.ChangePassword("mypassword");

Однако его не работает (на симуляторе и iphone). Он получает эту ошибку:

at (обертка, управляемая на основе) Mono.Data.Sqlite.UnsafeNativeMethods.sqlite3_rekey (intptr, byte [], int) < 0x0005c > при (оболочка, управляемая на основе) Mono.Data.Sqlite.UnsafeNativeMethods.sqlite3_rekey (intptr, byte [], int) < 0x0005c > при Mono.Data.Sqlite.SQLite3.ChangePassword(байт []) < 0x00053 > при Mono.Data.Sqlite.SqliteConnection.ChangePassword(байт []) < 0x0004b > при Mono.Data.Sqlite.SqliteConnection.ChangePassword(строка) < 0x0005b >

Кто-нибудь успешно использовал защиту паролем в базе данных sqlite в Monotouch?

4b9b3361

Ответ 1

В соответствии с моим исследованием существует несколько вариантов шифрования базы данных с помощью MonoTouch. У меня есть предстоящее сообщение в блоге по этому вопросу, но пока это ваши лучшие два варианта:

SQLCipher

Я существенно автоматизировал процесс сборки SQLCipher. Все, что требуется, это простая команда make, и у вас есть библиотека, которую вы можете связать с вашим проектом. Он использует огромную библиотеку SQLite-NET. После этого все, что требуется, это предоставить ключ в файле SQLite.cs.

CSharp-SQLite

Это управляемый порт библиотеки SQLite в С#. Производительность всего около ~ 2x медленнее, что довольно удивительно, учитывая, что это не собственный код!

Ответ 2

Попробуйте добавить "; пароль = mypassword" в строку подключения и удалить вызов ChangePassword.

Обратите внимание, что по умолчанию реализация sqlite для iPhone не поддерживает шифрование, поэтому команды sqlite для этого не будут работать.

Вы можете получить (оплаченную) копию шифрованной версии sqlite из http://www.hwaci.com/sw/sqlite/see.html и скомпилировать ее в ваше приложение, чтобы удалить libsqlite3 *.dylib из вашего проекта, если вы связали это.

Возможно, вам придется немного поработать в документации и/или эксперименте Monotouch, чтобы убедиться, что сама библиотека Monotouch не включает стандартную реализацию sqlite по умолчанию, а на самом деле ссылки на указанную вами реализацию. Сначала попробуйте, если все по-прежнему не работает, когда я начну искать.

Вы можете сделать этот эксперимент, не заплатив за зашифрованную версию, просто используя исходный код sqlite3, доступный в сети, с соответствующими точками останова.

Удачи!

PS: Обратите внимание, что на данный момент в Android нет сопоставимого решения для Android, это работает на iPhone, потому что iPhone запускает собственный C-код.

PPS: Существует также SQLCipher, который утверждает, что шифрует sqlite на iPhone. Однако я решил, что требования к конфигурации будут ниже моих стандартов для простоты. Я также не уверен, что он будет правильно вставлять себя между каркасом Monotouch и реализацией iPhone sqlite по умолчанию.

Ответ 3

SQLCipher для MonoTouch обеспечивает полное шифрование базы данных для баз данных SQLite.

http://sqlcipher.net/sqlcipher-for-monotouch

Существует также SQLCipher для Mono для Android, который позволяет повторно использовать один и тот же код в приложениях Mono Touch и MonoDroid.

http://sqlcipher.net/sqlcipher-for-monodroid

Ответ 4

Просто подумайте вслух, но может ли это быть связано с sqlite dynlib, который поставляется с iPhoneSDK, не являющимся потокобезопасным?

Для альтернативы вы можете попробовать посмотреть WWDC Vid 209 и просто заблокировать/зашифровать БД, когда находитесь вне приложения.

Ответ 5

Возможно, вы можете сделать это самостоятельно, выпустив "pragma rekey" в сыром SQLite-запросе - то есть, если версия SQLite установлена ​​на самом деле SqlCipher.

Ответ 6

У меня была та же проблема, но с приложением формы Windows на С#. Я не мог найти решение, поэтому мне пришлось зашифровать мои данные вручную, когда вы его сохранили и расшифровали при извлечении.