gpt4 book ai didi

ios - SWIFT - Realm 数据库加密不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 05:58:15 27 4
gpt4 key购买 nike

我正在尝试加密存储在 Realm 数据库中的数据。我关注了Sample Code在 Realm 的 Swift page 上提到.我想加密数据而不是数据库文件。下面是我正在使用的代码:

    var error: NSError? = nil
let configuration = Realm.Configuration(encryptionKey: EncryptionManager().getKey())

if let realmE = Realm(configuration: configuration, error: &error) {
// Add an object
realmE.write {
realmE.add(objects, update: T.primaryKey() != nil)
}
}

其中 objects 是我需要插入数据库的对象列表。下面是同样从示例代码中选取的 getKey() func 的代码:

func getKey() -> NSData {
// Identifier for our keychain entry - should be unique for your application
let keychainIdentifier = "io.Realm.test"
let keychainIdentifierData = keychainIdentifier.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!

// First check in the keychain for an existing key
var query: [NSString: AnyObject] = [
kSecClass: kSecClassKey,
kSecAttrApplicationTag: keychainIdentifierData,
kSecAttrKeySizeInBits: 512,
kSecReturnData: true
]

// To avoid Swift optimization bug, should use withUnsafeMutablePointer() function to retrieve the keychain item
// See also: http://stackoverflow.com/questions/24145838/querying-ios-keychain-using-swift/27721328#27721328
var dataTypeRef: AnyObject?
var status = withUnsafeMutablePointer(&dataTypeRef) { SecItemCopyMatching(query, UnsafeMutablePointer($0)) }
if status == errSecSuccess {
return dataTypeRef as! NSData
}

// No pre-existing key from this application, so generate a new one
let keyData = NSMutableData(length: 64)!
let result = SecRandomCopyBytes(kSecRandomDefault, 64, UnsafeMutablePointer<UInt8>(keyData.mutableBytes))

// Store the key in the keychain
query = [
kSecClass: kSecClassKey,
kSecAttrApplicationTag: keychainIdentifierData,
kSecAttrKeySizeInBits: 512,
kSecValueData: keyData
]

status = SecItemAdd(query, nil)
assert(status == errSecSuccess, "Failed to insert the new key in the keychain")

return keyData
}

问题是代码没有加密。当我使用 Realm Browser 打开 Realm 文件时插入数据后代码未加密。

在模拟器和设备上测试。使用 Swift 1.2、Xcode 6.4、Realm 0.95。

有什么想法吗?

最佳答案

Realm 的加密功能仅适用于加密整个 .realm 文件的能力。没有任何功能可以加密 .realm 文件中的离散对象并让其余部分保持原样。

如果您确实想这样做,恐怕您需要自己运行加密系统。

如果我要这样做,我会这样做:

  1. 创建一个带有 NSData 属性的 Realm Object 子类加密数据
  2. 使用NSCoding 协议(protocol)。 ( Saving custom SWIFT class with NSCoding to UserDefaults )
  3. 使用您选择的加密方法 (AES Encryption for an NSString on the iPhone) 加密生成的 NSData 对象
  4. 将生成的加密 NSData 对象保存到 Realm 对象的 encryptedData 属性中。
  5. 当您想要检索该数据时逆向执行该过程。

虽然这个过程可行,但如您所见,这是一项非常重要的额外工作,而且您还会在此过程中失去 Realm 的所有速度和内存节省优势。

我鼓励您重新考虑您应用的设计,看看是否可以使用 Realm 自己的加密功能。祝你好运!

关于ios - SWIFT - Realm 数据库加密不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32718005/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com