Domanda

Ho cercato di cifrare / decifrare un database SQLite nel mio progetto iPhone. Sono in grado di crittografare il database utilizzando il metodo ridigitare. Ma io sono in grado di decifrare. Ho mantenuto il mio file sqlite.db in una cartella. Attualmente provarlo su un simulatore.

Snippet di codice:

[[SQLiteDB sharedSQLiteDB] open:<path to the folder> withKey:@""];

[[SQLiteDB sharedSQLiteDB] reKey:@"abc"];

[[SQLiteDB sharedSQLiteDB] close];

[[SQLiteDB sharedSQLiteDB] open:<path to the folder> withKey:@"abc"];

[[SQLiteDB sharedSQLiteDB] reKey:@""];

.....

- (BOOL)open:(NSString *)path withKey:(NSString *)masterKey {

    if (sqlite3_open([path fileSystemRepresentation], &_db) != SQLITE_OK) {
        NSLog(@"SQLite Opening Error: %s", sqlite3_errmsg(_db));
        return NO;
    }

    if(masterKey)
        sqlite3_exec(_db, [[NSString stringWithFormat:@"PRAGMA key = '%@'", masterKey] UTF8String], NULL, NULL, NULL);

    if (sqlite3_exec(_db, (const char*) "SELECT count(*) FROM sqlite_master", NULL, NULL, NULL) != SQLITE_OK)
    {
        [self close];
        NSLog(@"SQLite Key Error!");
        return NO;
    }

    filePath = [path retain];
    return YES;
}

......

- (void)reKey:(NSString *)masterKey
{
    sqlite3_exec(_db, [[NSString stringWithFormat:@"PRAGMA rekey = '%@'", masterKey] UTF8String], NULL, NULL, NULL);

}

Ho letto i messaggi su questo tema in gruppi google sqlcipher, ma sono in grado di decifrare. Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

riposava dalla mailing list:

Se si sta tentando di prendere un database non crittografato esistente, cifrare, e poi decifrare indietro, il nostro approccio consigliato è di non uso ridigitare, ma invece di utilizzare database collegati per copiare i dati tra uno standard e un database sqlcipher . Ci sono ulteriori informazioni e un esempio concreto qui:

http://www.zetetic.net/blog/2009/12/29/how-to-encrypt-a-plaintext-sqlite-database-to-use-sqlcipher/

Se, invece, si sta solo cercando di utilizzare sqlcipher per crittografare i dati in generale (vale a dire senza alcuna conversione da un database pre-esistente), allora basta usare sqlite3_key. È fondamentalmente solo apre il database, fornire la chiave e poi effettuare chiamate sql. Non ci sono separati passaggi di crittografia / decrittografia - tutto questo viene gestito al volo dal codice sqlcipher. Nel codice che hai postato in precedenza, che non avevo mai chiamare rekey a tutti. Ogni volta che si apre il database si chiama chiave PRAGMA, e quindi eseguire un rapido controllo per garantire che sqlite_master è leggibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top