我想使用预先填充数据的加密Realm数据库。问题是我在本地生成并将密钥存储在设备上,因此您可以想象,当我将该域文件带到另一个设备时,密钥不起作用。这就是我生成加密密钥的方法。
func getKey() -> NSData {
// Identifier for our keychain entry - should be unique for your application
let keychainIdentifier = "io.Realm.Test12345"
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)!
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
}
如果没有明确说明可以在所有设备上打开文件的密钥,有没有办法可以做到这一点?我想我可以在代码中逐行生成数据库,并确保从一开始就加密,但不方便。
答案 0 :(得分:2)
如果没有明确指定加密密钥,则无法对Realm进行加密。如果在创建Realm文件时没有提供加密密钥,它将被创建为未加密的,如果您在此之后尝试使用其他密钥,则该文件将拒绝打开。
可以通过使用新密钥保存副本来更改Realm文件的加密密钥。您可能做的事情是为您的加密Realm提供模糊加密密钥以及应用程序,并且在应用程序启动时,它会创建该Realm文件的本地副本,并使用设备生成的加密密钥成为那之后的主要领域。
如果您想要额外的安全性并且不想将初始加密密钥烘焙到应用程序中,您还可以考虑将加密的Realm文件与应用程序一起包括在内,但您需要执行安全的Web请求来下载加密打开它的关键。
我希望这给了你一些想法! :)