0

私はこれに関するいくつかの投稿があることを知っていますが、私が見逃していない/現在のものがないことを確認したいだけです。

暗号化されていないデータベースでsqlcipherを使用して、それを暗号化する必要があります。新しいデータベースの暗号化は正常に機能しています。

既存のデータベースでsqlcipherキーの再生成を試みていますが、機能していないようです(データベースは暗号化されていないままです)。

       [fmdb open];
       NSString *sel = @"SELECT count(*) FROM sqlite_master";            
       FMResultSet *fmr = [self executeQuery : fmdb : sel];

        if ( [fmr next] ) // unencrypted
        {
            NSLog(@"Encrypting");
            fmdb.key = @"";
            [fmdb rekey : @"somekey"];
        }

それ以外の場合は、他のPRAGMAメソッドのいずれかを使用する必要があります。

キーの再生成は、すでに暗号化されているデータベースでのみ機能しますか?

これはFMDatabaseフレームワークを使用していますが、フレームワークの内部で実行しています...

    - (BOOL)rekey:(NSString*)key {
    #ifdef SQLITE_HAS_CODEC
    if (!key) {
        return NO;
    }

    int rc = sqlite3_rekey(db, [key UTF8String], (int)strlen([key UTF8String]));

    if (rc != SQLITE_OK) {
        NSLog(@"error on rekey: %d", rc);
        NSLog(@"%@", [self lastErrorMessage]);
    }

    return (rc == SQLITE_OK);
    #else
        return NO;
    #endif
   }

sqlite3_rekeyを介して実行され、エラーは発生しませんが、データベースは暗号化されません。

4

2 に答える 2

4

この質問に対するこれまでのコメントはすべて正しくありません。キーの再生成を使用してプレーンテキストデータベースを暗号化することはできません。キーの再生成は、暗号化されたデータベースの暗号化キーを変更するためにのみ使用されます。

プレーンテキストデータベースを暗号化する正しい方法は、アタッチしてエクスポートすることです。ここの例を参照してくださいhttp://sqlcipher.net/sqlcipher-api/#sqlcipher_export

于 2012-04-12T12:20:34.453 に答える
0

トリックは、データベースがすでに暗号化されているときに暗号化をチェックするために使用される場合(次回アプリを開くとき)、選択を行うためにキーを使用しない場合、これは失敗しますが、データベースを閉じる必要があり、キーで再度開きました。

于 2012-04-16T15:36:19.093 に答える