我正在尝试使用可转换属性类型对核心数据中的用户密码进行加密和解密。这是我的 NSValueTransformer
子类:
@objc (PasswordTransformer) class PasswordTransformer: NSValueTransformer {
override class func transformedValueClass() -> AnyClass {
return NSData.self
}
override class func allowsReverseTransformation() -> Bool {
return false
}
override func transformedValue(value: AnyObject?) -> AnyObject? {
if let string = value as? String {
let tuple = Utils.encryptString(string)
let first = tuple.0 as NSData?
if first != nil {
return first!
}
}
return nil
}
}
我想要发生的是当我像这样设置用户密码时:user.password = "somepassword"
,密码应该自动加密并返回为 NSData
使用我的 Utils.encryptString()
函数(构建在 RNEncryptor
之上)。然后,当我检索该属性的值时,它应该返回 NSData
对象。相反,我的转换器子类永远不会被调用,密码属性仍然是一个明文字符串,我绝对不想将其发送到我的服务器。
我在我的 CoreData 模型文件中指定了值转换器,并注册为在我的 NSManagedObject
子类中转换的值,所以我知道这不是问题所在。当我将密码设置为字符串时,是否有任何原因不会自动转换?转换后的值是否仅在保存到核心数据上下文时使用,而不是在有人尝试访问该属性时使用?
最佳答案
Is the value transformed only used when saving into a core data context and not whenever someone tries to access that property?
没错。值转换器的目的是将内存中的对象转换为持久存储文件中的另一种对象。通常这意味着在保存时将某种对象 Core Data 不直接处理为 NSData
并在加载数据时反转过程。变形金刚不会影响对象的内存属性值。
简而言之,
- 值转换器仅在保存更改时起作用
- 不可逆值转换器对 Core Data 属性没有意义。
关于ios - 在 CoreData 中安全地加密和存储密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28016806/