我将一些键/值对作为字符串存储在CoreData中,在较新的版本中,现在应该对其进行加密。为了不仅仅依靠Apples DataProtection ,我现在想在存储之前使用RNCryptor并借助ValueTransformer类的帮助对数据进行加密。
但是,不调用转换函数,也不触发调试输出或断点。字符串现在存储为数据对象,但是可以以二进制表示形式以纯文本格式读取-显然,它们没有被加密。
这是我更改的内容:
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"
}
}
}
因此,该应用程序继续正常运行,并且可以存储和检索所有数据库对象(区别在于它们现在存储为数据对象而不是字符串)。我正在直接使用»DB Browser for SQLite«检查SQLite数据库。
预期的行为将是CoreData中的加密条目。有人可以告诉我我想念什么吗?我发现有些教程没有做任何其他实现,而StackOverflow上的几篇文章也都无法解决这个问题。
我试图将输出函数的转换数据从Data更改为NSData,但没有结果。我是否缺少某些东西,以便实际上调用ValueTransformer?任何提示将不胜感激!
答案 0 :(得分:1)
您尚未覆盖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
。