iOS Sqlite加密(FMDB/SQLCipher)
2016-07-29 15:50
423 查看
/** * 对数据库加密 * * @param path path description * * @return return value description */ + (BOOL)encryptDatabase:(NSString *)path; /** * 对数据库解密 * * @param path path description * * @return return value description */ + (BOOL)unEncryptDatabase:(NSString *)path; /** * 修改数据库秘钥 * * @param dbPath dbPath description * @param originKey originKey description * @param newKey newKey description * * @return return value description */ + (BOOL)changeKey:(NSString *)dbPath originKey:(NSString *)originKey newKey:(NSString *)newKey;
+ (BOOL)encryptDatabase:(NSString *)path { NSString *sourcePath = path; NSString *targetPath = [NSString stringWithFormat:@"%@.tmp.db", path]; if([self encryptDatabase:sourcePath targetPath:targetPath]) { NSFileManager *fm = [[NSFileManager alloc] init]; [fm removeItemAtPath:sourcePath error:nil]; [fm moveItemAtPath:targetPath toPath:sourcePath error:nil]; return YES; } else { return NO; } } + (BOOL)unEncryptDatabase:(NSString *)path { NSString *sourcePath = path; NSString *targetPath = [NSString stringWithFormat:@"%@.tmp.db", path]; if([self unEncryptDatabase:sourcePath targetPath:targetPath]) { NSFileManager *fm = [[NSFileManager alloc] init]; [fm removeItemAtPath:sourcePath error:nil]; [fm moveItemAtPath:targetPath toPath:sourcePath error:nil]; return YES; } else { return NO; } } + (BOOL)encryptDatabase:(NSString *)sourcePath targetPath:(NSString *)targetPath { const char* sqlQ = [[NSString stringWithFormat:@"ATTACH DATABASE '%@' AS encrypted KEY '%@';", targetPath, kEncryptKey] UTF8String]; sqlite3 *unencrypted_DB; if (sqlite3_open([sourcePath 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); return YES; } else { sqlite3_close(unencrypted_DB); NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(unencrypted_DB)); return NO; } } + (BOOL)unEncryptDatabase:(NSString *)sourcePath targetPath:(NSString *)targetPath { const char* sqlQ = [[NSString stringWithFormat:@"ATTACH DATABASE '%@' AS plaintext KEY '';", targetPath] UTF8String]; sqlite3 *encrypted_DB; if (sqlite3_open([sourcePath UTF8String], &encrypted_DB) == SQLITE_OK) { sqlite3_exec(encrypted_DB, [[NSString stringWithFormat:@"PRAGMA key = '%@';", kEncryptKey] UTF8String], NULL, NULL, NULL); // Attach empty unencrypted database to encrypted database sqlite3_exec(encrypted_DB, sqlQ, NULL, NULL, NULL); // export database sqlite3_exec(encrypted_DB, "SELECT sqlcipher_export('plaintext');", NULL, NULL, NULL); // Detach unencrypted database sqlite3_exec(encrypted_DB, "DETACH DATABASE plaintext;", NULL, NULL, NULL); sqlite3_close(encrypted_DB); return YES; } else { sqlite3_close(encrypted_DB); NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(encrypted_DB)); return NO; } } + (BOOL)changeKey:(NSString *)dbPath originKey:(NSString *)originKey newKey:(NSString *)newKey { sqlite3 *encrypted_DB; if (sqlite3_open([dbPath UTF8String], &encrypted_DB) == SQLITE_OK) { sqlite3_exec(encrypted_DB, [[NSString stringWithFormat:@"PRAGMA key = '%@';", originKey] UTF8String], NULL, NULL, NULL); sqlite3_exec(encrypted_DB, [[NSString stringWithFormat:@"PRAGMA rekey = '%@';", newKey] UTF8String], NULL, NULL, NULL); sqlite3_close(encrypted_DB); return YES; } else { sqlite3_close(encrypted_DB); NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(encrypted_DB)); return NO; } }
相关文章推荐
- 编写sql sever存储过程随笔
- 要用PLSQLDEV必须安装oracle客户端且不支持64位oracle客户端
- ubuntu14.04 下 mysql 存储目录迁移
- 大量read by other session导致oracle性能低
- mysql中null 或者 空字符串判断
- SQL学习笔记之(DATETIME)
- 【SQL】 DROP DELATE区别
- 【转-整理】Mysql 数据类型详解
- 如何安装和配置Mantis
- mysql性能优化-慢查询分析、优化索引和配置
- mysql自学笔记
- SQL Server T-SQL高级查询
- 学习笔记-mysql_视图
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
- mysql解压缩版安装
- ORACLE函数之日期时间运算函数
- mysql mysqldump只导出表结构或只导出数据的实现方法
- redis sentinel集群配置及haproxy配置
- 数据库为什么要用B+树结构--MySQL索引结构的实现
- mysql binlog