如何使用此加密方法保存在核心数据中加密的数据?

时间:2016-04-07 01:46:44

标签: cocoa core-data encryption

我有一种加密字符串和平的方法。方法似乎工作得很好。我的问题是我不知道如何使用它,所以我可以将数据存储在加密的核心数据中。

我的实施内容,我有以下几行代码:

#define CC_USERNAME @"myusername"
#define CC_PASSWORD @"mypassrod"
#define CC_SALTED_STRING [NSString stringWithFormat:@"someRandomStringHere%@anDhEreAsWEll", CC_PASSWORD]

以下是方法:

-(void)encryptWebsiteUrl {

    NSData *hash = [NSData sha256forData:CC_SALTED_STRING];
    NSData *iVector = [NSData generateRandomIV:16];

    NSInteger row = [self.websitesTableView selectedRow];
    NSTableColumn *column = [self.websitesTableView tableColumnWithIdentifier:@"websiteUrl"];
    NSCell *cell = [column dataCellForRow:row];
    NSLog(@"cell value:%@", [cell stringValue]);


    NSString *message = [cell stringValue]; // here, I should get the cell value
    NSData *messageData = [message dataUsingEncoding:NSUTF8StringEncoding];

    NSMutableData *encryptedData = [[NSMutableData alloc] initWithData:iVector];

    NSData *payLoad = [NSData encrypt:messageData key:hash iv:iVector];

    [encryptedData appendData:payLoad];
    message = encryptedData;
    NSLog(@"Encrypted message is: %@",message);


    NSData *pureData = [encryptedData subdataWithRange:NSMakeRange(16, [encryptedData length] - 16)];
    NSData *extractedVector = [encryptedData subdataWithRange:NSMakeRange(0, 16)];


    NSData *decryptedData = [NSData decrypt:pureData key:hash iv:extractedVector];

    NSString *decryptedMessage = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
    //NSLog(@"Decrypted message is: %@",decryptedMessage);

}

现在,我这样称呼这个方法:

-(void)controlTextDidEndEditing:(NSNotification *)obj {
    [self encryptWebsiteUrl];
}

在控制台日志中,我有以下输出:

细胞价值:www.newone.com 加密消息是:< 474ca213 c80b9135 ae5a31ad f5004006 556de1db 6835cad2 aa408084 442a8a1f>

在加密方法中,我使用s elf.websitesTableView 。这是一个表视图,只有一列我存储我的数据,该列名为 websiteUrl (参见方法中的代码)

我的问题是:如何使用此方法将websiteUrl的加密值存储在核心数据中,而核心数据现在以未加密的方式存储。

我想在这里提两件事。一,在核心数据中,属性websiteUrl是可转换的,其次,我使用绑定,这就是为什么我没有发布任何与在websiteTableView中保存或插入数据相关的代码。

2 个答案:

答案 0 :(得分:1)

是的,您可以将二进制数据存储在Core Data中。该二进制数据的内容与Core Data无关。因此,是的,您可以将加密数据存储在Core Data中。

但是,您可能还需要考虑其他两个选项:

  1. 在钥匙串中存储这样的东西。这就是它的设计目标。
  2. 启用Core Data的文件级加密,以使加密对您和您的应用程序透明。
  3. 如果要存储加密数据,请将实体的属性配置为二进制数据。然后你只需要将NSData设置为该属性。您甚至可以为子类添加便捷方法,以便子类NSManagedObject之外的所有内容只能访问未加密的数据。

    更新1

    NSPersistentStoreFileProtectionKey添加到NSPersistentStore时,您可以将NSPersistentStoreCoordinator键添加到选项中。

    let options:[String:AnyObject] = [NSPersistentStoreFileProtectionKey: NSFileProtectionComplete]
    

    然后将这些选项传递到addPersistentStoreWithType...

    您正在寻找的加密体验有多种选择。

答案 1 :(得分:0)

解决方案1.在数据模型中使用值变换器。 NSValueTranformer to encrypt data

解决方案2.在绑定中使用值转换器。这与解决方案1的变换值相同。

解决方案3.在自定义访问器中进行加密和解密。

解决方案4.使用加密和解密的属性。