CoreData:不调用ValueTransformer函数

时间:2018-11-23 17:16:37

标签: 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"
        }
    }
}

因此,该应用程序继续正常运行,并且可以存储和检索所有数据库对象(区别在于它们现在存储为数据对象而不是字符串)。我正在直接使用»DB Browser for SQLite«检查SQLite数据库。

预期的行为将是CoreData中的加密条目。有人可以告诉我我想念什么吗?我发现有些教程没有做任何其他实现,而StackOverflow上的几篇文章也都无法解决这个问题。

我试图将输出函数的转换数据从Data更改为NSData,但没有结果。我是否缺少某些东西,以便实际上调用ValueTransformer?任何提示将不胜感激!

1 个答案:

答案 0 :(得分:1)

您尚未覆盖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