2012-04-11 72 views
2

我目前在我的iOS应用程序中使用FMDatabase,我很满意它。 我打算使用SQLCipher加密sqlite数据库。iOS上的SQLite + SQLCipher + FMDatabase

这里是我的问题:

1)FMDatabase和SQLCipher兼容机?我想我只需要在FMDatabase中添加一个名为openEncrypted ...的新方法,然后执行SQLCipher的工作。我希望所有的FMDatabase方法都可以工作。

2)其实,我的应用程序中有2个数据库。然后我在我的应用程序中添加一个附加数据库以加入它们。我想只对其中一个进行加密。它会工作还是我需要加密2个数据库? (一个是关键的,另一个不是)

3)如果我对这些文件进行加密,我不太明白要提供给Apple(文档)的内容。

谢谢你!

+1

1.是2.是的,它的简单只是覆盖“打开”方法来加密/解密您的数据库。 – CarlJ 2012-04-11 13:15:00

+0

谢谢你meccan。会试试这个。 – 2012-04-11 20:55:26

回答

2

对于那些寻找关于如何做到这一点简单的教程中,我能创造一个:http://www.guilmo.com/fmdb-with-sqlcipher-tutorial/

但最重要的部分,打开现有的DB和连接一个新的加密的。然后在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

几个星期前我遇到了你的教程,并保存起来以备以后查看,今天早上我注意到网站已关闭?是否有可能在网站上查看或以其他方式发布教程?提前致谢! – valosip 2016-02-17 21:56:29

+0

@valosip我正在更换服务器,DNS应该很快就会传播,链接将恢复工作。 – gmogames 2016-02-17 22:30:06

+0

谢谢!我最终找到了一个缓存副本让我去! – valosip 2016-02-17 22:41:42

0

嗨我正在使用swift和以下是我遵循的代码。但我有一个问题,我可以用SQLiteBrowser打开encrypted.sqlite文件,这里我错了。

var db: COpaquePointer = nil; 
     let databasePath = FileUtils.getPath("data.db") 
     var ecDB = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0].stringByAppendingPathComponent("encrypted.sqlite") 
    let result = String.fromCString("ATTACH DATABASE \(ecDB) AS encrypted KEY TaP") 
if (sqlite3_open(databasePath, &db) == SQLITE_OK) { 
sqlite3_exec(db, result!, nil, nil, nil); 
sqlite3_exec(db, "SELECT sqlcipher_export('encrypted');", nil, nil, nil); 
sqlite3_exec(db, "DETACH DATABASE encrypted;", nil, nil, nil); 
sqlite3_close(db); 
     } 
     else { 
      sqlite3_close(db); 
      sqlite3_errmsg(db); 
     }