【问题标题】:How can i store encrypted data如何存储加密数据
【发布时间】:2020-05-19 14:32:38
【问题描述】:

我正在尝试在 UserDefaults 中存储和检索我的加密文本数据,但检索它时出现问题。我使用 CryptoKit 来加密和解密数据。

错误消息是:“无法将 'Foundation.__NSSwiftData' (0x7fff89d1ee50) 类型的值转换为 'CryptoKit.ChaChaPoly.SealedBox' (0x7fff8085abc8)。”

有没有更好的方法将 SymmetricKey 存储在钥匙串中,而无需通过 UnsafeBytes 将其转换为字符串?我使用 SwiftKeychainWrapper。

func encrypt(text: String) {
    let key = SymmetricKey(size: .bits256)
    let message = text.data(using: .utf8)!
    let sealedBox = try! ChaChaPoly.seal(message, using: key)

    let defaults = UserDefaults.standard
    defaults.set(sealedBox.combined, forKey: "sealedBox")

    let savedKey = key.withUnsafeBytes {Data(Array($0)).base64EncodedString()}
    Services.saveKey(key: savedKey)
}

func decrypt() {
    let savedKey = Services.getKey()

    if let keyData = Data(base64Encoded: savedKey) {
        let retrievedKey = SymmetricKey(data: keyData)

        let defaults = UserDefaults.standard
        let sealedBox = (defaults.object(forKey: "sealedBox") as? ChaChaPoly.SealedBox)!

        let decryptedMessage = try! ChaChaPoly.open(sealedBox, using: retrievedKey)
        textView.text = String(data: decryptedMessage, encoding: .utf8)!
    }
}

【问题讨论】:

    标签: ios swift apple-cryptokit


    【解决方案1】:

    您将 Data 存储在 UserDefaults 中,因此您必须再次提取它。然后从中创建一个SealedBox,如下所示:

    let defaults = UserDefaults.standard
    let data = defaults.object(forKey: "sealedBox") as? Data
    
    let sealedBox = try! ChaChaPoly.SealedBox(combined: data!)
    let decryptedMessage = try! ChaChaPoly.open(sealedBox, using: retrievedKey)
    

    (当然你要避免在实际生产代码中强制解包)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-22
      • 2015-11-05
      • 2012-04-07
      • 2016-12-25
      • 2011-07-15
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多