Как я могу хранить зашифрованные данные

Я пытаюсь сохранить и получить свои зашифрованные текстовые данные в UserDefaults, но с их получением возникла проблема. Я использую CryptoKit для шифрования и дешифрования данных.

Сообщение об ошибке: "Не удалось преобразовать значение типа" Foundation.__NSSwiftData "(0x7fff89d1ee50) в" CryptoKit.ChaChaPoly.SealedBox "(0x7fff8085abc8)".

Есть ли лучший способ сохранить SymmetricKey в цепочке для ключей без преобразования его в String с помощью 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)!
    }
}

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)

(конечно, вы захотите избежать принудительных развертываний в реальном производственном коде)

Другие вопросы по тегам