Я храню некоторые пары ключ / значение в виде Strings в CoreData, которые - в более новой версии - теперь должны быть зашифрованы.Чтобы не только полагаться на Apple DataProtection Теперь я хочу зашифровать данные перед их сохранением с помощью RNCryptor и с помощью класса ValueTransformer.
Однако преобразование -функции не вызываются, ни выходные отладки, ни точки останова не срабатывают.Строки теперь хранятся в виде объектов данных, но могут быть прочитаны в виде простого текста в двоичном представлении - поэтому они, очевидно, не зашифрованы.
Здесьчто я изменил:
- Добавлена и активирована новая схема миграции / базы данных
- Изменен столбец ключа и значения с Типа Строка на Преобразуемый
- Установите для Value Transformer значение » EncryptedStringTransformer «, а для пользовательского класса - » String «
- и наконец я добавил файл 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?Любая подсказка будет высоко ценится!