Как спрятать данные CoreData?


#1

Знаю, что если iPhone c JailBreak подключить к iFunBox, то там можно внести изменения в самые разные файлы, например в .sqlite. А я хочу , чтобы эти файлы не отображались при открытии файловой системы.

Нашел туториал, но он на Objective-C

Как такое делается на Swift?


#2

Пытаюсь сейчас переделать код с Objective-C на Swift.
Но одно застрял на одном выражении.

Как мне объект options сделать на swift так, чтобы он был типа [AnyHashable:Any]? ?


#3

Вот мой код

Компилятор возмущаешься по поводу:

  1. “:” между “journal_mode” и “DELETE”
  2. По поводу complete

// MARK: - Core Data stack

func applectationDocumentsDirectory()->URL{
    
    let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!
    return documentURL
}

lazy var managedObjectModel: NSManagedObjectModel = {
    let modelURL = Bundle.main.url(forResource: "App2", withExtension: "momd")!
    return NSManagedObjectModel(contentsOf: modelURL)!
}()

lazy var persistentContainer: NSPersistentContainer = {

    let fileURL = applectationDocumentsDirectory().appendingPathComponent("App2.sqlite")
    
    var options :[AnyHashable:Any]

    options = [AnyHashable("journal_mode":"DELETE"):NSSQLitePragmasOption,AnyHashable(complete):NSPersistentStoreFileProtectionKey]
  
    



    let container = NSPersistentContainer(name: "App2")
    container.persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: fileURL, options: <#T##[AnyHashable : Any]?#>)
    
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
     
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

#4

На другом примере увидел, как правильно передавать options:

let options = [ NSMigratePersistentStoresAutomaticallyOption : true,
NSInferMappingModelAutomaticallyOption : true ]

Но при моих значения у меня все вылетает

let options = [ NSSQLitePragmasOption : true,
                       NSPersistentStoreFileProtectionKey : true,
                        FileProtectionType.complete: true] as [AnyHashable : Any]

#5

В итоге я вроде все передал, но у меня файлы все равно видны , когда устройство заблокировано.

Вот код:

// MARK: - Core Data stack
lazy var applicationDocumentsDirectory: URL = {
    let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return urls[urls.count-1]
}()

lazy var managedObjectModel: NSManagedObjectModel = {
    let modelURL = Bundle.main.url(forResource: "AllPassword", withExtension: "momd")!
    return NSManagedObjectModel(contentsOf: modelURL)!
}()

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    
    
    // Это было переписано  
    let library = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) .last! as NSURL
    let url = library.appendingPathComponent("AllPassword.sqlite")
   //
  
    var failureReason = "There was an error creating or loading the application's saved data."
    do {
        // Тут были добавлены аргементы в options
        try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options:[
            NSSQLitePragmasOption: ["journal_mode": "DELETE"],
            NSPersistentStoreFileProtectionKey:FileProtectionType.complete] )
        
    } catch {
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject
        dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject
        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }
    
    return coordinator
}()

lazy var managedObjectContext: NSManagedObjectContext = {
    let coordinator = self.persistentStoreCoordinator
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}()

#6

Вы страдаете ерундой, джейл давно мёртв) Про защиту данных почитайте здесь.


#7

Читаю вашу статью и там написано, как защитить Core Data. У меня это применяется, но защиты никакой нет.

Я спокойно могу открыть sqlfile и смотреть что в нем. Тогда в чем заключается защита?


#8

По идее должно шифроваться. Можно ещё это попробовать.


#9

Я устанавливаю на устройство и после 10 секунд загружаю контейнер

В туториале, с которого я это все делал было показано, что использовов данный метод можно спрятать sql file, но я почему-то все вижу.

    try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options:[
        NSSQLitePragmasOption: ["journal_mode": "DELETE"],
        NSPersistentStoreFileProtectionKey:FileProtectionType.complete] )

А статьи, что вы указывали, написано, что если использовать данный метод, то данные CoreData будут шифроваться, но я спокойно могу просматривать эти данные.


#10

Может проще хранить данные в зашифрованном виде (шифровать не всю базу а отдельные атрибуты)?


#11

Погуглил я о своей проблеме. Те кто сталкивался говорят, что оно работает, но проверить это нельзя на своих устройствах, потому что:

  1. Когда я устанавливаю на устройство свое приложение,
    то я на нем подтверждаю, что разработчик имеет право получать доступ к данным
  2. Я доверяю компьютеру на котором я это устанавливаю

И из-за этого от меня оно эти данные не шифрует
А реально проверить это можно только на устройстве с jailbreak.

Буду еще пробовать SQLCIPHER, что вы мне посоветовали. Посмотрю как там это будет.