在 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 中安全加密和存储密码的主要内容,如果未能解决你的问题,请参考以下文章