Cifrado de db para problemas de SQLCipher

Tengo un problema con la creación de una nueva database cifrada. He investigado sobre esto y estas son algunas de las soluciones que he probado.

Usar terminal basado en http://sqlcipher.net/design/

sqlite3 sqlcipher.db sqlite> PRAGMA KEY='test123'; sqlite> CREATE TABLE t1(a,b); sqlite> INSERT INTO t1(a,b) VALUES ('one for the money', 'two for the show'); sqlite> .quit ~ $ hexdump -C sqlcipher.db 

ejecutar el hexdump todavía me da text db no encriptado.

Hacer la forma adjunta a Db existente en ios.

 - (void)encryptDB { sqlite3 *unencrypted_DB; NSString *path_u = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"unencrypted.db"]; if (sqlite3_open([path_u UTF8String], &unencrypted_DB) == SQLITE_OK) { NSLog(@"Database Opened"); // Attach empty encrypted database to unencrypted database sqlite3_exec(unencrypted_DB, "ATTACH DATABASE 'encrypted.db' AS encrypted KEY '1234';", NULL, NULL, NULL); // export database sqlite3_exec(unencrypted_DB, "SELECT sqlcipher_export('encrypted');", NULL, NULL, NULL); // Detach encrypted database sqlite3_exec(unencrypted_DB, "DETACH DATABASE encrypted;", NULL, NULL, NULL); NSLog (@"End database copying"); sqlite3_close(unencrypted_DB); } else { sqlite3_close(unencrypted_DB); NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(unencrypted_DB)); } } 

No hay problemas que se ejecuten arriba, pero encrypted.db no aparece en mi carpeta de documentos.

Después de configurar ssl y sqlcipher en mi aplicación. Usando esto

 - (void) openCipherDB { NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent: @"unencrypted.db"]; NSLog(@"database path %@", databasePath); sqlite3 *db; if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) { //sqlite3_exec(_db, "ATTACH DATABASE 'xyz.sqlite' AS encrypted KEY 'test';", NULL, NULL, &t) const char* key = [@"secret" UTF8String]; int sqlite3_key(sqlite3 *db, const void *pKey, int nKey); //i added this after seeing SO sqlite3_key(db, key, strlen(key)); 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(@"database initialize"); } else { NSLog(@"incorrect pass"); // incorrect password! } sqlite3_close(db); } } 

me da el NSLog de contraseña incorrecta y, por supuesto, mi db no está encriptado también.

¿Qué más puedo hacer para cifrar mi database? Gracias.

El primer problema que tienes es ejecutar sqlite3 en lugar de ./sqlite3. Debe proporcionar la ruta explícita a la versión sqlcipher de sqlite3 o terminará usando uno instalado como parte de su sistema operativo, que no admite encryption.

Para el segundo problema, debe proporcionar la ruta completa a su encryption.db en el adjunto (por ejemplo, de la misma manera que crea la ruta completa para unencrypted.db) utilizando stringByAppendingPathComponent.

También me enfrenté al segundo problema de adjuntar la database. Estaba confundido sobre cómo usar la solución proporcionada por Stephen, ya que no podía encontrar la forma de dar la ruta completa en la statement sql ya que solo acepta const char , finalmente encontré el código siguiente y funcionó, publicando lo mismo aquí

……..

 NSString *sql1 = [NSString stringWithFormat:@"ATTACH DATABASE '%s' AS encrypted KEY '%s'",[encryptedDBPath UTF8String],"1234" ]; NSLog(@"String is %@", sql1); sqlite3_exec(unencrypted_DB, [sql1 UTF8String], NULL, NULL, NULL); 

………………………………

-anoop