【问题标题】:How can I use this encryption method to save my data encrypted in core data?如何使用这种加密方法将我的数据加密保存在核心数据中?
【发布时间】:2016-04-09 23:41:12
【问题描述】:

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

在我的实现下面,我有以下代码行:

#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 中发布任何与保存或插入数据相关的代码的原因。

【问题讨论】:

  • 你能在绑定中使用值转换器吗?
  • 我不知道该怎么做。
  • 如果你使用绑定,使用arraycontroller.selectedObjects而不是tableview.selectedRow来获取数据。
  • 对不起,我的意思是价值转换器。查找NSValueTransformer
  • 格式化程序 (NSFormatter) 也可以解决问题。

标签: cocoa core-data encryption


【解决方案1】:

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

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

  1. 在钥匙串中存储这样的东西。这就是它的设计目的。
  2. 为 Core Data 启用文件级加密,以便加密对您和您的应用程序是透明的。

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

更新 1

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

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

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

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

【讨论】:

  • 我在 coredata 中名为 websiteUrl 的属性是可转换的。有了上面的代码(在我的问题中),你能发布一些代码吗?
  • 如何为 Core Data 开启文件级加密?
  • 在 OS X 上是否可以使用 Core Data 的文件级加密?
  • @user2417624 代码是什么?我提出了几个选项,加上另一个答案将您发送到带有代码的答案。您还需要多少代码以及什么主题?
  • @Willeke 不,根据文档,它仅适用于 iOS。
【解决方案2】:

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

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

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

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

【讨论】:

  • 如果您要编写自定义访问器,您真的不需要值转换器。可以直接从NSManagedObjectNSData 访问数据,并且从那里访问未加密数据也是同样的过程。
  • 从四个解决方案中选择一个,而不是两个。
猜你喜欢
  • 1970-01-01
  • 2012-11-25
  • 2013-02-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
相关资源
最近更新 更多