我有一种加密字符串和平的方法。方法似乎工作得很好。我的问题是我不知道如何使用它,所以我可以将数据存储在加密的核心数据中。
我的实施内容,我有以下几行代码:
#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中保存或插入数据相关的代码。
答案 0 :(得分:1)
是的,您可以将二进制数据存储在Core Data中。该二进制数据的内容与Core Data无关。因此,是的,您可以将加密数据存储在Core Data中。
但是,您可能还需要考虑其他两个选项:
如果要存储加密数据,请将实体的属性配置为二进制数据。然后你只需要将NSData设置为该属性。您甚至可以为子类添加便捷方法,以便子类NSManagedObject
之外的所有内容只能访问未加密的数据。
将NSPersistentStoreFileProtectionKey
添加到NSPersistentStore
时,您可以将NSPersistentStoreCoordinator
键添加到选项中。
let options:[String:AnyObject] = [NSPersistentStoreFileProtectionKey: NSFileProtectionComplete]
然后将这些选项传递到addPersistentStoreWithType...
。
您正在寻找的加密体验有多种选择。
答案 1 :(得分:0)
解决方案1.在数据模型中使用值变换器。 NSValueTranformer to encrypt data
解决方案2.在绑定中使用值转换器。这与解决方案1的变换值相同。
解决方案3.在自定义访问器中进行加密和解密。
解决方案4.使用加密和解密的属性。