1

ここsqlcipher_export()で指定されているとおりに を使用して、既存の Sqlite データベースを暗号化しました。すべてうまくいきました - エラーはありません。結果のデータベースが作成され、適切なサイズになります。ただし、 を使用して正しいキーを指定しても、暗号化されたデータベースを開くことができません。暗号化されていないデータベースは問題なく開きます。PRAGMA key

さらに、暗号化されたデータベースは奇妙に見えます。ヘッダーは暗号化されているようですが、データは暗号化されていません。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 ログはこちら.

(Sqlcipher をどのようにコンパイルしたかが重要な場合: Linux マシンで Sqlcipher 融合を作成し、結果の C ファイルを Windows マシンにコピーし、Visual C++ Express でコンパイルし、コンパイル済みの OpenSSL DLL にリンクしました。)

4

1 に答える 1

0

根本的な原因:に属していた破損したメモリHMAC_Init_ex()内の OpenSSL を呼び出し、それをゼロに設定します。に渡されたパラメータに隣接していました。(詳細は、元の投稿へのコメントの 1 つに記載されています。) これにより、暗号化されたページではなく、平文のページが暗号化されたファイルに書き込まれました。これは意味がなく、結果のデータベースが使用できなくなりました。sqlcipher_page_hmac()c_ctx->key_szc_ctx->key_szHMAC_Init_ex()sqlcipher_page_cipher()

OpenSSL を 0.9.8k から 1.0.0i にアップグレードすると、問題が修正されました。

于 2012-04-21T09:42:00.153 に答える