【问题标题】:Looking for right approach to saving data with Keychain and data encryption - Swift 5寻找使用钥匙串和数据加密保存数据的正确方法 - Swift 5
【发布时间】:2019-05-26 00:30:43
【问题描述】:

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

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

  1. 我正在使用 PropertyList 对数组中的自定义类型进行编码/解码
  2. 然后将这些传递给 Keychain。感谢 Kishikawa Katsumi,我正在使用一个名为 KeychainAccess 的包装器。
  3. 从 Keychain 中检索数据,然后将其解码以显示在 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 是否有意义?

我花了几个星期寻找详细的解决方案,但还没有运气。请帮助新开发者。

【问题讨论】:

    标签: swift keychain property-list


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我没有说我正在使用 PropertyListEncoder 加密数据,我问的是是否需要在保存到 Keychain 之前加密数据(我知道它会加密两次)。我认为这是我不确定 PropertyListEncoder 是否没有保存而只是编码(就像你说的序列化)的原因,并且没有关于 plist 的内容,因为我听说 plist 存储不安全。
    • 我知道你说的。我说“钥匙链通常被认为是足够安全的。”如果您不同意,请加密。
    • 感谢您的评论。请您告知 PropertyListEncoder 不保存数据而只是编码?根据 Apple 的文档,它说“将数据类型实例编码为属性列表的对象”。这让我很困惑。这是否意味着它将其编码数据发送到 info.plist?对不起,我是新手,所以需要很多学习。非常感谢!
    • 它不会在任何地方“发送”任何东西。你说let data = try? propertyListEncoder.encode(userInfo),你会得到一些数据。结束。您如何处理这些数据取决于您。
    • 太好了,我很清楚。这有很大帮助。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2020-11-24
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多