我是否以正确的方式整合 SQL Cipher?
Am I integrating SQL Cipher the right way?
之前我用的是Xcode自带的SQLite3库,创建数据库的代码如下:
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = dirPaths[0];
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:@"databases/database.sqlite"]];
NSLog(@"DB Path: %@", databasePath);
NSFileManager *filemgr = [NSFileManager defaultManager];
if ([filemgr fileExistsAtPath: databasePath ] == NO) {
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &myDatabase) == SQLITE_OK) {
char *errMsg;
const char *sql_data = "CREATE TABLE IF NOT EXISTS myTableName.....";
if (sqlite3_exec(myDatabase, sql_data, NULL, NULL, &errMsg) == SQLITE_OK) {
NSLog(@"Database OK");
[self setDatabase];
} else {
NSLog(@"Data Base Fail");
}
sqlite3_close(myDatabase);
} else {
NSLog(@"Database fail");
}
}
最近需要对一个数据库文件进行加密,在网上简单搜索了一下,发现有些网站推荐使用SQL Cipher。
我按照 link 中描述的方式在我的代码中实现了它,我唯一要做的就是保留该代码(我之前说过),并使用这两个命令在 sqlite3_open 之后:
const char* keyTB = [@"MySecretPassword" UTF8String];
sqlite3_key(myDatabase, keyTB, (int)strlen(keyTB));
为了检查我的数据库是否加密,我用文本编辑器打开它,我看到了这个:
øøèDEÆ?>o›$™;⁄iìÚÄ’†í]¥d=ˇÓä\ÊźáÓÈ?ïÒ[ÅaÚvÁƒ•i%í≈ª¢.£s◊Âc®Øì≈ àÜU—–}Gec‹≥’B∂¡¸¸Æ™√3Ìnú»YÆ"ß
¬?wÚ÷fñoÂ≈ÛͯzÏâ⁄˛Ct°˘ΩfìÙº0ˇfi]
‚ŸSw∂â≤≥‘=�H€BN±HÇûß…∑º.náaߨO¬ˇ¢(B¨‹óµ¬;º‹ÀÒ
真的 SQL Cipher 加密了我的数据库(256 位 AES 加密)吗?或者需要在我的代码中做一些配置?
建议您不要直接将密码嵌入数据库,但这并不是SQLCipher 工作的严格要求。一旦将 SQLCipher 集成到您的应用程序中,您只需要在打开连接后使用 sqlite3_key
键控数据库。要验证加密数据库的状态,通常会 运行 hexdump -C
数据库文件本身,内容应该无法辨认。
之前我用的是Xcode自带的SQLite3库,创建数据库的代码如下:
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = dirPaths[0];
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:@"databases/database.sqlite"]];
NSLog(@"DB Path: %@", databasePath);
NSFileManager *filemgr = [NSFileManager defaultManager];
if ([filemgr fileExistsAtPath: databasePath ] == NO) {
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &myDatabase) == SQLITE_OK) {
char *errMsg;
const char *sql_data = "CREATE TABLE IF NOT EXISTS myTableName.....";
if (sqlite3_exec(myDatabase, sql_data, NULL, NULL, &errMsg) == SQLITE_OK) {
NSLog(@"Database OK");
[self setDatabase];
} else {
NSLog(@"Data Base Fail");
}
sqlite3_close(myDatabase);
} else {
NSLog(@"Database fail");
}
}
最近需要对一个数据库文件进行加密,在网上简单搜索了一下,发现有些网站推荐使用SQL Cipher。
我按照 link 中描述的方式在我的代码中实现了它,我唯一要做的就是保留该代码(我之前说过),并使用这两个命令在 sqlite3_open 之后:
const char* keyTB = [@"MySecretPassword" UTF8String];
sqlite3_key(myDatabase, keyTB, (int)strlen(keyTB));
为了检查我的数据库是否加密,我用文本编辑器打开它,我看到了这个:
øøèDEÆ?>o›$™;⁄iìÚÄ’†í]¥d=ˇÓä\ÊźáÓÈ?ïÒ[ÅaÚvÁƒ•i%í≈ª¢.£s◊Âc®Øì≈ àÜU—–}Gec‹≥’B∂¡¸¸Æ™√3Ìnú»YÆ"ß ¬?wÚ÷fñoÂ≈ÛͯzÏâ⁄˛Ct°˘ΩfìÙº0ˇfi] ‚ŸSw∂â≤≥‘=�H€BN±HÇûß…∑º.náaߨO¬ˇ¢(B¨‹óµ¬;º‹ÀÒ
真的 SQL Cipher 加密了我的数据库(256 位 AES 加密)吗?或者需要在我的代码中做一些配置?
建议您不要直接将密码嵌入数据库,但这并不是SQLCipher 工作的严格要求。一旦将 SQLCipher 集成到您的应用程序中,您只需要在打开连接后使用 sqlite3_key
键控数据库。要验证加密数据库的状态,通常会 运行 hexdump -C
数据库文件本身,内容应该无法辨认。