2016-04-29 11 views
2

データであらかじめ入力されている暗号化されたレルムデータベースを使用したいとします。問題は、デバイス上に鍵を生成してローカルに格納することであり、想像すると、その領域ファイルを別のデバイスに持ってくると、鍵は機能しません。これが私が暗号鍵を生成する方法です。明示的にキーを記述しなくても、事前入力済みの暗号化レルムファイルを使用できますか?

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

あなたは、アプリケーションに暗号化キーを格納するだけで終わったのですか? – SimplyLearning

+0

@SimplyLearning私は結果を照会するために私のサーバーを使用してしまったので、すべての結果を簡単に取得できるわけではありません。それが私のユースケースではうまくいきました。 – AppreciateIt

+0

ああ、あなたはサーバーに行って、Realmを完全にオフラインで削ってしまったのですか?私はレルムを活用していて、アプリケーションのダウンロード時に自分のDBを暗号化したいので、ヘルパーファイルのキーをハードコーディングすることを考えていました。 – SimplyLearning

答えて

2

暗号化キーを明示的に指定しなくても、レルムを暗号化することはできません。レルムファイルの作成時に暗号化キーを提供しないと、暗号化されずに作成されます。そのあとで別のキーを使用しようとすると、そのファイルは開けられません。

新しいキーでコピーを保存することで、レルムファイルの暗号化キーを変更することができます。あなたが潜在的に行うことができることは、暗号化されたレルムにアプリケーションと一緒に難読化された暗号化キーを提供することです。アプリケーションの最初の起動時に、Realmファイルのローカルコピーが作成されます。メイン・レルムはその時点以降です。

セキュリティを強化し、アプリケーションに初期暗号化キーを焼き付けたくない場合は、暗号化されたレルムファイルをアプリとともに含めることも検討できますが、セキュアなウェブリクエストを実行してダウンロードする必要があります暗号化キーを押して開きます。

私はあなたにいくつかのアイデアを贈りたがっていますか? :)

関連する問題