swift - 核心数据 : ValueTransformer functions are not called

标签 swift encryption core-data rncryptor

我将一些键/值对作为字符串存储在 CoreData 中——在较新的版本中——现在应该被加密。为了不单独依赖 Apples DataProtection,我现在想在使用 RNCryptor 存储之前加密数据并借助 ValueTransformer 类。

但是,转换函数没有被调用,调试输出和断点都没有被触发。这些字符串现在存储为数据对象,但可以以二进制表示的纯文本形式读取 - 因此它们显然未加密。

DB Browser

这是我改变的地方:

  • 添加并激活了新的迁移/数据库方案
  • 将键和值列从 String 类型更改为 Transformable
  • 将值转换器设置为 »EncryptedStringTransformer«,将自定义类设置为 »String«

Data model

  • 最后,我添加了一个文件 Encryption.swift,实现如下:
import Foundation
import RNCryptor

class EncryptedStringTransformer : ValueTransformer {
    let password = "SuperSecurePassword"

    override class func allowsReverseTransformation() -> Bool{
        return true
    }

    func transformedValue(value: String?) -> NSData? {

        guard let data = value else {
            return nil
        }
        let encryptData = Data(data.utf8)
        let ciphertext = RNCryptor.encrypt(data: encryptData, withPassword: password)
        return ciphertext as NSData
    }

    func reverseTransformedValue(value: NSData?) -> String? {
        guard value != nil else {
            return "nil"
        }
        do {
            let originalData = try RNCryptor.decrypt(data: (value! as Data), withPassword: password)
            return String(data: originalData, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))!

        } catch {
            print(error)
            return "nil"
        }
    }
}

因此,该应用程序继续完美运行,并且可以存储和检索所有数据库对象(不同之处在于它们现在存储为数据对象而不是字符串)。我正在使用 »SQLite 数据库浏览器« 直接检查 SQLite 数据库。

预期的行为将是 CoreData 中的加密条目。有人能告诉我我错过了什么吗?我发现一些教程没有做任何额外的实现,StackOverflow 上的几篇文章也没有帮助解决这个问题。

我试图将转换函数的输出数据从 Data 更改为 NSData,但没有结果。我是不是遗漏了什么,所以实际上调用了 ValueTransformer?任何提示将不胜感激!

最佳答案

您还没有覆盖 ValueTransformer 的正确方法。你的方法是:

func transformedValue(value: String?) -> NSData?
func reverseTransformedValue(value: NSData?) -> String?

正确的方法是:

func transformedValue(_ value: Any?) -> Any?
func reverseTransformedValue(_ value: Any?) -> Any?

您实现错误方法的重要提示是您不需要添加 override 关键字。

顺便说一句,这个表达式:

encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))!

可以替换为:

encoding: .uf8

return nil 替换你的 return "nil" 可能会更好;它是一个 String?,所以如果出现问题,它可以是 nil

关于swift - 核心数据 : ValueTransformer functions are not called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53450724/

相关文章:

ios - Xcode 6 Swift WebThread 崩溃并出现 EXC_BAD_ACCESS 错误

swift - 从 UITableViewCell 呈现 UIAlertController

java - 您能否将使用 Java 准备语句通过 jdbc 发送的数据分类为加密数据?

java - 如何解决java中的NoSuchAlgorithmException?

ios - Swift:功能结束时的反馈

ios - 应用程序被 iOS 强制重启并使用新的隐私设置

.net - 我可以利用 GPU 从 .NET 进行 AES 加密吗?如果是这样,如何?

objective-c - -[NSCFNumber 计数] : unrecognized selector

iphone - 重新加载 UITableView 数据而不重新加载 View ?

ios - 如何将 CoreData 获取结果放入(多维)数组?