在 CoreData 中安全加密和存储密码

Posted

技术标签:

【中文标题】在 CoreData 中安全加密和存储密码【英文标题】:Securely Encrypt And Store Password in CoreData 【发布时间】:2015-01-19 01:38:56 【问题描述】:

我正在尝试使用可转换属性类型加密和解密核心数据中的用户密码。这是我的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",密码应该自动加密并使用我的Utils.encryptString() 函数返回为NSData(它建立在@之上987654326@)。然后,当我检索该属性的值时,它应该返回 NSData 对象。相反,我的转换器子类永远不会被调用,并且密码属性仍然是一个明文字符串,我绝对不想发送到我的服务器。

我在我的 CoreData 模型文件中指定了值转换器并注册为在我的 NSManagedObject 子类中转换的值,所以我知道这不是问题。当我将密码设置为字符串时,是否有任何原因不会自动转换?转换的值是否仅在保存到核心数据上下文时使用,而不是在有人尝试访问该属性时使用?

【问题讨论】:

【参考方案1】:

转换的值是否仅在保存到核心数据上下文时使用,而不是在有人尝试访问该属性时使用?

没错。值转换器的目的是将内存中的对象转换为持久存储文件中的不同类型的对象。通常这意味着在加载数据时保存和反转过程时,Core Data 不会直接将某种对象转换为NSData。变形金刚不会影响对象的内存属性值。

总之,

值转换器仅在保存更改时工作 不可逆的值转换器对 Core Data 属性没有意义。

【讨论】:

嗯,有道理。所以我真的应该把属性类型设置为二进制数据,然后自己在加密和未加密之间来回转换。 如果你不想在内存中保存原始密码,那是正确的。

以上是关于在 CoreData 中安全加密和存储密码的主要内容,如果未能解决你的问题,请参考以下文章

Flask实现密码存储安全性

用户密码加密存储十问十答,一文说透密码安全存储

数据库存储安全之(MD5+盐)加密

存储 iOS 应用的用户密码和用户名

Web安全--使用Salt + Hash将密码加密后再存储进数据库

数据库加密系统