CoreData:未调用 ValueTransformer 函数
CoreData: ValueTransformer functions are not called
我将一些 key/value-pairs 作为字符串存储在 CoreData 中,在较新的版本中,现在应该对其进行加密。为了不单独依赖苹果 DataProtection 我现在想在使用 RNCryptor 存储数据之前加密数据,并借助 ValueTransformer class.
但是,转换函数没有被调用,调试输出和断点都没有被触发。这些字符串现在存储为数据对象,但可以以二进制表示的纯文本形式读取 - 因此它们显然没有加密。
这是我更改的内容:
- 添加并激活了一个新的 migration/database 方案
- 已将键和值列从类型 String 更改为 Transformable
- 将值转换器设置为 »EncryptedStringTransformer« 并将自定义 Class 设置为 »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"
}
}
}
因此,该应用程序继续完美运行,并且可以存储和检索所有数据库对象(不同之处在于它们现在存储为数据对象而不是字符串)。我正在使用 »DB Browser for SQLite« 直接检查 SQLite 数据库。
预期的行为将是 CoreData 中的加密条目。有人能告诉我我错过了什么吗?我发现的一些教程没有做任何额外的实现,Whosebug 上的几篇文章也没有帮助解决这个问题。
我试图将转换函数的输出数据从 Data 更改为 NSData,但没有结果。我是不是遗漏了什么,所以实际上调用了 ValueTransformer?任何提示将不胜感激!
您没有覆盖 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
。
我将一些 key/value-pairs 作为字符串存储在 CoreData 中,在较新的版本中,现在应该对其进行加密。为了不单独依赖苹果 DataProtection 我现在想在使用 RNCryptor 存储数据之前加密数据,并借助 ValueTransformer class.
但是,转换函数没有被调用,调试输出和断点都没有被触发。这些字符串现在存储为数据对象,但可以以二进制表示的纯文本形式读取 - 因此它们显然没有加密。
这是我更改的内容:
- 添加并激活了一个新的 migration/database 方案
- 已将键和值列从类型 String 更改为 Transformable
- 将值转换器设置为 »EncryptedStringTransformer« 并将自定义 Class 设置为 »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"
}
}
}
因此,该应用程序继续完美运行,并且可以存储和检索所有数据库对象(不同之处在于它们现在存储为数据对象而不是字符串)。我正在使用 »DB Browser for SQLite« 直接检查 SQLite 数据库。
预期的行为将是 CoreData 中的加密条目。有人能告诉我我错过了什么吗?我发现的一些教程没有做任何额外的实现,Whosebug 上的几篇文章也没有帮助解决这个问题。
我试图将转换函数的输出数据从 Data 更改为 NSData,但没有结果。我是不是遗漏了什么,所以实际上调用了 ValueTransformer?任何提示将不胜感激!
您没有覆盖 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
。