2017-10-06 11 views
0

レルムファイルを暗号化する必要があります。アプリ起動時にこのようにします。レルムデータベースを暗号化してクラッシュする

- (void)encryptRealm { 
    // Generate 64 bytes of random data to serve as the encryption key 
    uint8_t buffer[64]; 
    SecRandomCopyBytes(kSecRandomDefault, 64, buffer); 
    NSData *keyData = [[NSData alloc] initWithBytes:buffer length:sizeof(buffer)]; 

    // Create a Realm Configuration object with the encryption key 
    RLMRealmConfiguration *configuration = [RLMRealmConfiguration defaultConfiguration]; 
    configuration.encryptionKey = keyData; 

    // Attempt to open a Realm file with the encryption key 
    NSError *error = nil; 
    RLMRealm *realm = [RLMRealm realmWithConfiguration:configuration error:&error]; 

    // If the encryption key was not accepted, the error will state that the database was invalid 
    if (error != nil) { 
     NSLog(@"%@", error.localizedDescription); 
     return; 
    } 
} 

このようにクラッシュします。私は何が起こるかは分かりません。どうすればいいですか? チュートリアルはこちらからです。

https://academy.realm.io/posts/tim-oliver-realm-cocoa-tutorial-on-encryption-with-realm/

2017年10月6日15:58:+ 0800 33.366167 2.0 [20770:6589296]アライブ: 「/ VAR *** によりキャッチされない例外 'RLMException'、理由にアプリを終了/mobile/Containers/Data/Application/FA128FC0-BB80-469E-8B05-6B7957AD04A1/Documents/default.realm: パスをレルムで開くことができません '/ var/mobile/Containers/Data/Application/FA128FC0-BB80- 469E-8B05-6B7957AD04A1/Documents/default.realm ': レルムファイルではありません。'

+0

私はあなたが明らかに動作しません二つの異なる暗号化キーと同じファイルを再度開こうと想定しています。 2回目に同じ暗号化キーを使用する必要があります。 – EpicPandaForce

答えて

2

各起動時に新しいキーを生成するのではなく、特定のレルムに使用する暗号化キーを保存する必要があります。その記事では、さらにダウンリンクされた暗号化例がありexample of how to do this

- (NSData *)getKey { 
    // Identifier for our keychain entry - should be unique for your application 
    static const uint8_t kKeychainIdentifier[] = "io.Realm.EncryptionExampleKey"; 
    NSData *tag = [[NSData alloc] initWithBytesNoCopy:(void *)kKeychainIdentifier 
               length:sizeof(kKeychainIdentifier) 
             freeWhenDone:NO]; 

    // First check in the keychain for an existing key 
    NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassKey, 
          (__bridge id)kSecAttrApplicationTag: tag, 
          (__bridge id)kSecAttrKeySizeInBits: @512, 
          (__bridge id)kSecReturnData: @YES}; 

    CFTypeRef dataRef = NULL; 
    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataRef); 
    if (status == errSecSuccess) { 
     return (__bridge NSData *)dataRef; 
    } 

    // No pre-existing key from this application, so generate a new one 
    uint8_t buffer[64]; 
    status = SecRandomCopyBytes(kSecRandomDefault, 64, buffer); 
    NSAssert(status == 0, @"Failed to generate random bytes for key"); 
    NSData *keyData = [[NSData alloc] initWithBytes:buffer length:sizeof(buffer)]; 

    // Store the key in the keychain 
    query = @{(__bridge id)kSecClass: (__bridge id)kSecClassKey, 
       (__bridge id)kSecAttrApplicationTag: tag, 
       (__bridge id)kSecAttrKeySizeInBits: @512, 
       (__bridge id)kSecValueData: keyData}; 

    status = SecItemAdd((__bridge CFDictionaryRef)query, NULL); 
    NSAssert(status == errSecSuccess, @"Failed to insert new key in the keychain"); 

    return keyData; 
} 
+0

ありがとうございます。それは働く。あなたは最高です。 –

関連する問題