0

私は現在、iPhone 用のシンプルなアカウント管理アプリに取り組んでいます。データベースの暗号化と復号化に sqlcipher を使用しています。

現在、アプリケーション バンドルに暗号化されていないデータベースがあり、これを iPhone ドキュメント ディレクトリにコピーしてから暗号化するか、ドキュメント ディレクトリにコピーする前に暗号化する必要があります。

私が直面している問題は、「ATTACH」データベースメソッドであろうと「key()/rekey」であろうと、どのような暗号化方法を使用しようとしても、何をしても暗号化されていないデータベースを取得しているように見えることです()" 方法。

ターミナルで「ATTACH」データベース メソッドを使用しようとしましたが、結果は暗号化されていないデータベースでした。ここに見られるように、プログラムで「key()/rekey()」メソッドを使用してみました:

 sqlite3 *db;
 NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"KeyCrypt.sqlite"];
 if (sqlite3_open([defaultDBPath UTF8String],&db)==SQLITE_OK) {
  NSLog (@"Running keying.");
  sqlite3_key(db, "1234", 4);
  if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
   // password is correct, or, database has been initialized
   NSLog (@"This has occured correctly?");
  } 
  else 
  {
   // incorrect password!
   NSLog (@"This has occured incorrectly?");
  }
 }

私はどこかで何か間違ったことをしていますか?私は丸一日オンラインで調査を試みましたが、実行前または実行中にデータベースが暗号化されない理由の解決策を見つけることができませんでした:(

追加情報が必要な場合は、喜んで提供します。生徒を助けてください。

ありがとう!

編集:

私のデータベースをキーにするために使用される方法の抜粋。

 //Initializing the sqlite3_key function.
        int sqlite3_key(sqlite3 *db, const void *pKey, int nKey);
        sqlite3_key(db, "1234", 4);

どうやら私は sqlite3_key を初期化しなかったようです -_-".また、ファイルが暗号化されているにもかかわらず、チェックはまだ何かが間違って発生し、データベースが正常に開かれなかったと言っています.

データベースを開く場合、データベースを開くたびに、sqlite3_key を正しく実行する必要がありますか? そして、そのインスタンス中に、通常どおりデータベースにアクセスできますか?

助けてくれてありがとう。

4

1 に答える 1

3

暗号化されていないデータベースを暗号化されたデータベースに変換するためにキーの再生成を使用することは、ページ サイズとページごとの初期化ベクトルに必要な予約バイトの変更に伴ういくつかの複雑さのため、SQLCipher ではサポートされなくなりました。したがって、提供したコードは、最近のバージョンの SQLCipher では動作しません。やりたいことに基づいて、次の 2 つのオプションがあります。

  1. データベースに暗号化を追加するための現在のガイダンスは、ATTACH を使用することです。つまり、暗号化されたデータベースを標準の SQLite データベースに接続し、2 つの間でデータをコピーします。アプローチを説明する投稿は次のとおりです。プレーンテキストの SQLite データベースを暗号化して SQLCipher を使用する方法
  2. 暗号化されていないデータベースをアプリケーション バンドルに配布する代わりに、既知のキーを使用するデータベースの暗号化されたコピーを含めるだけです。次に、起動時にデータベースを所定の場所にコピーし、既知のデフォルト キーで開き、新しいユーザーごとのキー データでキーの再生成を実行します。これにより、必要に応じて新しいキーを使用するようにデータベースが書き換えられます。
于 2010-11-30T20:00:16.870 に答える