我创建了一个小型企业应用程序..在我的应用程序中,我使用了sqlite数据库来存储数据..这里我决定使用加密方法使用安全框架..我知道sqlite但我不知道如何实现sqlite加密方法......请指导我....
答案 0 :(得分:2)
Shane Powell接受的答案不正确。
NSFileProtectionKey 之后设置NSFileProtectionComplete addPersistentStoreWithType:configuration:URL:options:error:无效,即应用默认设置(NSFileProtectionCompleteUntilFirstUserAuthentication),这样安全性较低。
正确的方法是在为options参数传递的字典中为 NSPersistentStoreFileProtectionKey 设置NSFileProtectionComplete(请注意,此键特定于持久存储)...
NSDictionary *fileAttributes = @{NSPersistentStoreFileProtectionKey : NSFileProtectionComplete};
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:fileAttributes error:&error]) {
...
我使用PhoneView对此进行了测试,并且能够在使用接受的答案方法进行初始解锁后访问锁定设备上的SQLite,但是在初始解锁后我无法访问锁定设备上的SQLite我建议的方法。
答案 1 :(得分:1)
您使用NSFileProtectionComplete功能(仅适用于ios 4及更高版本)。
以下是为example.sqlite创建NSPersistentStoreCoordinator的示例,如果在ios4上使用,则会加密。
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"example.sqlite"];
NSURL *storeUrl = [NSURL fileURLWithPath:storePath ];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
// Handle error
}
if(RSRunningOnOS4OrBetter())
{
NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];
if (![[NSFileManager defaultManager] setAttributes:fileAttributes ofItemAtPath:storePath error:&error]) {
// Handle error
}
}
return persistentStoreCoordinator;
}
BOOL RSRunningOnOS4OrBetter(void) {
static BOOL didCheckIfOnOS4 = NO;
static BOOL runningOnOS4OrBetter = NO;
if (!didCheckIfOnOS4) {
NSString *systemVersion = [UIDevice currentDevice].systemVersion;
NSInteger majorSystemVersion = 3;
if (systemVersion != nil && [systemVersion length] > 0) { //Can't imagine it would be empty, but.
NSString *firstCharacter = [systemVersion substringToIndex:1];
majorSystemVersion = [firstCharacter integerValue];
}
runningOnOS4OrBetter = (majorSystemVersion >= 4);
didCheckIfOnOS4 = YES;
}
return runningOnOS4OrBetter;
}