Ios 加密领域数据库及其崩溃

Ios 加密领域数据库及其崩溃,ios,realm,Ios,Realm,我需要加密领域的文件,我喜欢这个在应用程序启动 - (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:b

我需要加密领域的文件,我喜欢这个在应用程序启动

- (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;
    }
}
它就这样崩溃了。我不知道会发生什么。我该怎么办? 教程从这里开始

2017-10-06 15:58:33.366167+0800活着2.0[20770:6589296]*** 由于未捕获的异常“RLMEException”而终止应用程序,原因: “/var/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”: 不是领域文件。”


您需要存储用于给定领域的加密密钥,而不是在每次启动时生成新密钥。文章中进一步链接的加密示例有:


您需要存储用于给定领域的加密密钥,而不是在每次启动时生成新密钥。文章中进一步链接的加密示例有:


我假设您试图用两个不同的加密密钥重新打开同一个文件,这显然不起作用。您需要使用相同的加密密钥才能再次打开它我假设您尝试使用两个不同的加密密钥重新打开同一个文件,这显然不起作用。您需要使用相同的加密密钥才能再次打开它
- (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;
}