Как я могу хранить зашифрованные данные
Я пытаюсь сохранить и получить свои зашифрованные текстовые данные в 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)
(конечно, вы захотите избежать принудительных развертываний в реальном производственном коде)