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

在执行过程中,我有以下代码行:

#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
加密的消息是:

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

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

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

最佳答案

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

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


将这样的事情存储在钥匙串中。这就是它的设计目的。
打开核心数据的文件级加密,以便加密对您和您的应用程序都是透明的。


如果要存储加密的数据,请将实体的属性配置为二进制数据。然后,您只需将NSData设置为该属性即可。您甚至可以在子类中添加便捷方法,以便子类NSManagedObject之外的所有内容都只能访问未加密的数据。

更新1

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

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


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

您正在寻找几种加密体验选项。

10-01 05:38
查看更多