寻找通过钥匙串和数据加密保存数据的正确方法-Swift 5

时间:2019-05-26 00:30:44

标签: swift keychain property-list

我的应用程序存储了用户的敏感数据,我想知道什么是通用/正确/最安全的数据保护方法。

我现在的方法是将编码后的数据保存到钥匙串中,更具体地说,但很简单:

  1. 我正在使用PropertyList对数组中的自定义类型进行编码/解码
  2. 然后将其传递给钥匙串。感谢Kishikawa Katsumi,我正在使用一个名为KeychainAccess的包装器。
  3. 从钥匙串中检索数据,然后将其解码以显示在tableview上。

下面是我的代码位:

extension UserInformation {

    static let propertyListEncoder = PropertyListEncoder()
    static let propertyListDecoder = PropertyListDecoder()
    static let keychain = Keychain(service: "com.xxxxx.DataSaving-App")

    static func saveToKeychain(userInfo: [UserInformation]) {
        let data = try? propertyListEncoder.encode(userInfo)
        if let savingData = data {
            dump(userInfo)
            keychain[data: "encodedUserInfo"] = NSData(data: savingData) as Data
        }
    }

    static func loadFromKeychain() -> [UserInformation]? {
        guard let retrievedData = keychain[data: "encodedUserInfo"] else {
            return nil }
        let data = try? propertyListDecoder.decode(Array<UserInformation>.self, from: retrievedData)
        return data
    }

}

以上操作正常,到目前为止没有发现问题。但是,我不确定使用PropertyListEncoder是正确的编码/解码方式。请恳请参阅以下指定问题,并向我提供建议。

  1. 以上方法是否足够安全?
  2. PropertyListEncoder / Decoder是否只是在进行编码/解码,而不是将数据保存到任何东西,例如plist或易受攻击的任何存储?
  3. 如果需要采取其他措施,是否可以使用Common Swift加密数据,然后将其传递给Keychain?

我花了几周的时间找到详细的解决方案,但还没有走运。请帮助新开发者。

1 个答案:

答案 0 :(得分:0)

属性列表编码未加密。它是纯文本(可能是二进制格式);它只是序列化的一种形式。您的示例中的“加密”包括以下事实:信息隐藏在钥匙串中。而且钥匙串通常被认为足够安全。