CoreData: функции ValueTransformer не вызываются - PullRequest
0 голосов
/ 23 ноября 2018

Я храню некоторые пары ключ / значение в виде Strings в CoreData, которые - в более новой версии - теперь должны быть зашифрованы.Чтобы не только полагаться на Apple DataProtection Теперь я хочу зашифровать данные перед их сохранением с помощью RNCryptor и с помощью класса ValueTransformer.

Однако преобразование -функции не вызываются, ни выходные отладки, ни точки останова не срабатывают.Строки теперь хранятся в виде объектов данных, но могут быть прочитаны в виде простого текста в двоичном представлении - поэтому они, очевидно, не зашифрованы.

DB Browser

Здесьчто я изменил:

  • Добавлена ​​и активирована новая схема миграции / базы данных
  • Изменен столбец ключа и значения с Типа Строка на Преобразуемый
  • Установите для Value Transformer значение » EncryptedStringTransformer «, а для пользовательского класса - » String «

Data model

  • и наконец я добавил файл Encryption.swift со следующей реализацией:
import Foundation
import RNCryptor

class EncryptedStringTransformer : ValueTransformer {
    let password = "SuperSecurePassword"

    override class func allowsReverseTransformation() -> Bool{
        return true
    }

    func transformedValue(value: String?) -> NSData? {

        guard let data = value else {
            return nil
        }
        let encryptData = Data(data.utf8)
        let ciphertext = RNCryptor.encrypt(data: encryptData, withPassword: password)
        return ciphertext as NSData
    }

    func reverseTransformedValue(value: NSData?) -> String? {
        guard value != nil else {
            return "nil"
        }
        do {
            let originalData = try RNCryptor.decrypt(data: (value! as Data), withPassword: password)
            return String(data: originalData, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))!

        } catch {
            print(error)
            return "nil"
        }
    }
}

Итак, приложение продолжает работатьбезупречно, и все объекты базы данных могут быть сохранены и извлечены (с той разницей, что они теперь хранятся как объект данных, а не как строка).Я проверяю базу данных SQLite напрямую с помощью »Браузер БД для SQLite«.

Ожидаемое поведение - зашифрованные записи в CoreData.Может кто-нибудь сказать мне, что мне не хватает?Некоторые учебники, которые я обнаружил, не делают никаких дополнительных реализаций, и несколько статей здесь, посвященных StackOverflow, также не помогают с этой проблемой.

Я попытался изменить выходные данные из функций преобразования с Data на NSData,без результата.Я что-то упустил, чтобы фактически вызывался ValueTransformer?Любая подсказка будет высоко ценится!

1 Ответ

0 голосов
/ 28 ноября 2018

Вы не изменили правильные методы ValueTransformer.Ваши методы:

func transformedValue(value: String?) -> NSData?
func reverseTransformedValue(value: NSData?) -> String?

Правильные методы:

func transformedValue(_ value: Any?) -> Any?
func reverseTransformedValue(_ value: Any?) -> Any?

Большой намек на то, что вы реализуете неправильные методы, заключается в том, что вам не нужно было добавлять override Ключевое слово.

Кстати, это выражение:

encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))!

можно заменить на:

encoding: .uf8

Было бы также лучше заменить return "nil" наreturn nil;это String?, поэтому может быть nil, если что-то пойдет не так.

...