iphone sqlite加密数据

时间:2011-03-02 09:10:33

标签: iphone sqlite encryption

我创建了一个小型企业应用程序..在我的应用程序中,我使用了sqlite数据库来存储数据..这里我决定使用加密方法使用安全框架..我知道sqlite但我不知道如何实现sqlite加密方法......请指导我....

2 个答案:

答案 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;
}