2012-07-04 49 views
0

我已經包含SQLCipher到我的項目完全一樣在這個環節上解釋加密數據庫:http://sqlcipher.net/ios-tutorial/不知道怎麼使用SQLCipher

但我不知道如何我從上面的鏈接閱讀說明加密數據庫,但沒有得到。
其實我正在做的是,如果應用程序第一次打開,那麼它會將數據庫(即沒有加密)複製到文檔目錄。從捆綁複製到文檔目錄時,我的數據庫還有一件事是空白的。
打開數據庫後,我試圖使用sqlite3_key函數,但沒有加密。但是我沒有發現如何從捆綁軟件複製到文檔目錄時如何加密數據庫。我打算使用FMDB,所以最好根據這個答覆。
請指導我如何做到這一點或指出方向,如果有任何教程。還建議應該採取什麼標準方法來做到這一點。

+0

啓動數據庫,做'PRAGMA REKEY '。關掉。再次啓動並執行'PRAGMA KEY <同一個鍵>',然後開始工作。 –

回答

0

說明這是在SQLCipher API頁[1]使用下sqlcipher_export(), 「實施例1:加密明文數據庫」

[1] http://sqlcipher.net/sqlcipher-api/#sqlcipher_export

+0

感謝您的幫助。但是,當我試圖發射聲明:sqlite3_exec(_db,「ATTACH DATABASE'xyz.sqlite'作爲加密密鑰'test';」,NULL,NULL,&t);它給我錯誤就像無法打開數據庫'xyz.sqlite'。可能是什麼問題 – Iducool

+0

我得到了這個問題,沒有提供完整路徑的可寫目錄這個功能是行不通的假設我只傳遞數據庫名稱然後它無法創建新的數據庫不知道什麼是 – Iducool

2

對於那些尋找一個簡單的如何做到這一點,我能夠創建一個:http://www.guilmo.com/fmdb-with-sqlcipher-tutorial/

但最重要的部分是,打開你現有的數據庫並附加一個新的加密的。然後在FMDB連接中設置密鑰。

SQLCipher - 加密數據庫

// Import sqlite3.h in your AppDelegate 
#import <sqlite3.h> 

// Set the new encrypted database path to be in the Documents Folder 
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentDir = [documentPaths objectAtIndex:0]; 
NSString *ecDB = [documentDir stringByAppendingPathComponent:@"encrypted.sqlite"]; 

// SQL Query. NOTE THAT DATABASE IS THE FULL PATH NOT ONLY THE NAME 
const char* sqlQ = [[NSString stringWithFormat:@"ATTACH DATABASE '%@' AS encrypted KEY 'secretKey';",ecDB] UTF8String]; 

sqlite3 *unencrypted_DB;  
if (sqlite3_open([self.databasePath UTF8String], &unencrypted_DB) == SQLITE_OK) { 

    // Attach empty encrypted database to unencrypted database 
    sqlite3_exec(unencrypted_DB, sqlQ, 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); 

    sqlite3_close(unencrypted_DB); 
} 
else { 
    sqlite3_close(unencrypted_DB); 
    NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(unencrypted_DB)); 
} 

self.databasePath = [documentDir stringByAppendingPathComponent:@"encrypted.sqlite"]; 

請注意,我們在SQL查詢的數據庫和密鑰設置2個參數。數據庫應該是完整路徑到您要創建的加密數據庫,在這種情況下,字符串ecDB,並且KEY參數是將用於加密您的數據庫的密鑰,因此請選擇強大的密鑰

現在您的FMDB功能,每次打開數據庫後,請撥打[db setKey:@「strongKey」]

// FMDatabase Example 
FMDatabase *db = [FMDatabase databaseWithPath:[self getDatabasePath]]; 
[db open]; 
[db setKey:@"secretKey"]; 


// FMDatabaseQueue Exmple 
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:[self getDatabasePath]]; 

[queue inDatabase:^(FMDatabase *db) { 
    [db setKey:@"secretKey"]; 
    ... 
}]; 

讓我知道如果您有任何問題!

+0

你好gmogames,我怎麼能解密加密的sqlite文件?謝謝 – RamGrg

+0

@RamGrg我從來沒有能夠解密使用程序或類似的東西,我只能在代碼中解密,就是這樣。 不是真的知道這種加密是如何工作的 – gmogames