2012-04-20 3 views
1

Я использовал sqlcipher_export(), точно так же, как указано here, чтобы зашифровать существующую базу данных Sqlite. Все прошло отлично - никаких ошибок, результирующая база данных не создана и имеет разумный размер. Однако я не могу открыть зашифрованную базу данных, хотя я указываю правильный ключ, используя PRAGMA key. Незашифрованные базы данных открываются без проблем.Sqlcipher, Windows: шифрование преуспевает, но производит странные результаты

Кроме того, зашифрованная база данных выглядит странно; заголовок, кажется, зашифрован, но не данные. См. http://i.stack.imgur.com/HaBpS.png, это изображение, показывающее двоичное сравнение между зашифрованными (левыми) и незашифрованными (правыми) базами данных.

В отладчике я могу видеть, что во время шифрования, программа проходит через sqlcipher_page_cipher(), но большую часть времени (каждый раз в течение 2-х вызовов, за исключением) следующее предложение выполняется, а функция возвращает рано:

/* just copy raw data from in to out when key size is 0 
    * i.e. during a rekey of a plaintext database */ 
    if(c_ctx->key_sz == 0) { 
    memcpy(out, in, size); 
    return SQLITE_OK; 
    } 

SQL выдается во время шифрования:

ATTACH DATABASE 'encrypted.db' AS encrypted KEY '12345'; 
SELECT sqlcipher_export('encrypted'); 
DETACH DATABASE encrypted; 

SQL, выданного во время открытия:

// open database 
PRAGMA key = '12345'; 
// try to read database - "file is encrypted or not a database" 

Журналы CODEC_TRACE, сгенерированные во время шифрования и дешифрования, - here.

(В случае, если важно, как я скомпилировал Sqlcipher: я создал слияние Sqlcipher на машине Linux, скопировал полученный C-файл на компьютер Windows, скомпилировал его в Visual C++ Express и связал с предварительно скомпилированной библиотекой OpenSSL.)

+0

След кодека показывает обработку ~ 17000 страниц. encrypted.db существует до начала экспорта? –

+0

Нет, его не существует. (Спасибо за быстрый ответ!) – user38329

+0

Я просто прошел тест с базой данных 138 МБ, точно так же, как задокументирован на сайте sqlcipher на окнах. он работал без проблем, результирующая база данных была зашифрована. Мне интересно, есть ли какая-то проблема с вашей сборкой. Можете ли вы попробовать использовать командную строку и посмотреть, работает ли она? –

ответ

0

Корневая причина: Вызывает HMAC_Init_ex() OpenSSL в sqlcipher_page_hmac() поврежденной памяти, которая относится к c_ctx->key_sz, устанавливая ее на ноль. c_ctx->key_sz был рядом с параметром, переданным в HMAC_Init_ex(). (Детали можно найти в одном из комментариев к исходному сообщению.) Это привело к тому, что sqlcipher_page_cipher() записывал незашифрованные страницы в зашифрованный файл вместо зашифрованных страниц. Это не имело смысла и сделало полученную базу данных непригодной для использования.

Обновление OpenSSL с 0.9.8k до 1.0.0i устраняет проблему.

Смежные вопросы