Iphone 使用SQLCipher将加密数据库附加到未加密数据库
我正在尝试使用SQLCipher将未加密的sqlite3数据库的内容添加到加密的数据库中。我已经把我想做的事情建立在和的基础上。然而,有几件事我还不清楚Iphone 使用SQLCipher将加密数据库附加到未加密数据库,iphone,encryption,sqlite,sqlcipher,Iphone,Encryption,Sqlite,Sqlcipher,我正在尝试使用SQLCipher将未加密的sqlite3数据库的内容添加到加密的数据库中。我已经把我想做的事情建立在和的基础上。然而,有几件事我还不清楚 在第行“附加数据库”中,加密数据库是否必须为.db类型?是否可以使用.sqlite来匹配我的原始数据库 所述加密数据库必须已经存在吗?如果是,它应该在应用程序中的什么位置?我是否必须提供文件路径(文档目录等) 在哪里可以找到成功加密的数据库?它将被保存在哪里 这是我的密码: + (void)encryptDB { sqlite3 *un
行“附加数据库”
中,加密数据库是否必须为.db
类型?是否可以使用.sqlite
来匹配我的原始数据库+ (void)encryptDB
{
sqlite3 *unencrypted_DB;
NSString *path_u = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
stringByAppendingPathComponent:@"dict.sqlite"];
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 'dict_encrypted.sqlite' AS encrypted KEY '1234';", NULL, NULL, NULL);
// Create new tables within encrypted database to match those in unencrypted database
sqlite3_exec(unencrypted_DB, "CREATE TABLE encrypted.t1(A,B,C);", NULL, NULL, NULL);
// Copy items from unencrypted database into encrypted database
sqlite3_exec(unencrypted_DB, "INSERT INTO encrypted.t1 SELECT * FROM t1;", 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));
}
}
嗯,我从来没有做过附加数据库,我使用的SQLCiper版本可能与您的不同,但是(对于我处理过的SQLCipher的实现),文件打开逻辑是标准的SQLite,其行为方式与没有SQLCipher的情况相同 因此,您不需要后缀
.db
或任何其他特定的名称,您可以使用任何您想要的名称
在发出REKEY
之前,任何新数据库都是完全“正常”的,并且将以“正常”的方式为SQLite创建/删除
重新ATTACH数据库
,我想最好先创建数据库(并REKEY
it),然后再附加它
在最新版本的SQLCipher中,我们提供了SQLCipher_export()函数,该函数可以缩短代码,并且不会连接到现有的数据库结构:
+ (void)encryptDB
{
sqlite3 *unencrypted_DB;
NSString *path_u = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
stringByAppendingPathComponent:@"dict.sqlite"];
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 'dict_encrypted.sqlite' 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));
}
}
我想我很好奇,为什么你的第二份参考资料说要使用这种技术,而不仅仅是
REKEY
来加密现有的数据库。我们的SQLCipher实现可以很好地处理现有数据库的REKEY
。回答得很好。非常感谢你。我的另一个问题是,我是否应该在单独的程序中加密数据库,并将此数据库添加到我想要使用的应用程序中?“将数据库'dict_encrypted.sqlite'作为加密密钥'1234'附加;
dict_encrypted.sqlite应该替换文档的路径。