データであらかじめ入力されている暗号化されたレルムデータベースを使用したいとします。問題は、デバイス上に鍵を生成してローカルに格納することであり、想像すると、その領域ファイルを別のデバイスに持ってくると、鍵は機能しません。これが私が暗号鍵を生成する方法です。明示的にキーを記述しなくても、事前入力済みの暗号化レルムファイルを使用できますか?
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
}
すべてのデバイスでファイルを開くことができるキーを明示的に指定しなければ、これを行う方法はありますか?私はコード内で行ごとにデータベースを生成し、最初から暗号化されていることを確認することができますが、それは便利ではありません。
あなたは、アプリケーションに暗号化キーを格納するだけで終わったのですか? – SimplyLearning
@SimplyLearning私は結果を照会するために私のサーバーを使用してしまったので、すべての結果を簡単に取得できるわけではありません。それが私のユースケースではうまくいきました。 – AppreciateIt
ああ、あなたはサーバーに行って、Realmを完全にオフラインで削ってしまったのですか?私はレルムを活用していて、アプリケーションのダウンロード時に自分のDBを暗号化したいので、ヘルパーファイルのキーをハードコーディングすることを考えていました。 – SimplyLearning