ios - 在 CoreData 中安全地加密和存储密码

标签 ios swift core-data

我正在尝试使用可转换属性类型对核心数据中的用户密码进行加密和解密。这是我的 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/

相关文章:

ios - 如何在启动时未检查 'use Core Data' 选项的项目中获取核心数据?

php - 使用节标题和节行解析 JSON

ios - 使使用 swift 协议(protocol)作为参数的 Objective-C 方法可公开访问

ios - 使用 TableView 或 CollectionView 时的 Swift、Slim Controller 代码

swift - 如何知道fetchRequest数据已经准备好?

iphone - 当上下文保存在核心数据中时,如何更改实体?

ios - tableviewcontroller 上的按钮拉伸(stretch)(Swift)?

ios - 我正在使用 String(char) 创建 String 但获得了可选值,如何删除它?

ios - 我的代码中显然有一个可选的,但编译器认为我没有

ios - 如何在 NavigationLink 中为目标 View 重用 View 模型实例