Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在OS-X应用程序中加密核心数据(sqllite)中的数据_Macos_Cocoa_Core Data_Encryption - Fatal编程技术网

Macos 如何在OS-X应用程序中加密核心数据(sqllite)中的数据

Macos 如何在OS-X应用程序中加密核心数据(sqllite)中的数据,macos,cocoa,core-data,encryption,Macos,Cocoa,Core Data,Encryption,我发现,如果我使用可转换类型的属性和NSXMLStoreType,我的数据是加密的,即已转换类型的属性是不可读的。不需要做任何其他事情,不需要代码请注意,我正在开发使用核心数据的OS-X应用程序。 但是,如果我将存储类型更改为NSSQLiteStoreType,则情况并非如此 我可以用sqllitebrowser打开数据库,选择可转换字段,如果我点击导出按钮,在生成的文本文件中,我可以正常读取值,即值(数据)未加密 我大约4个月前问过,但没有得到答复 另外,我在这里找到了stackoverflo

我发现,如果我使用可转换类型的属性和NSXMLStoreType,我的数据是加密的,即已转换类型的属性是不可读的。不需要做任何其他事情,不需要代码请注意,我正在开发使用核心数据的OS-X应用程序。

但是,如果我将存储类型更改为NSSQLiteStoreType,则情况并非如此

我可以用sqllitebrowser打开数据库,选择可转换字段,如果我点击导出按钮,在生成的文本文件中,我可以正常读取值,即值(数据)未加密

我大约4个月前问过,但没有得到答复

另外,我在这里找到了stackoverflow

您可以加密核心数据模型实体中的各个属性 通过使它们成为可转换的属性,然后创建 NSValueTransformer子类,用于加密和解密数据 为了那笔财产

不幸的是,我,答案的作者,@Brad Larson,没有提供一个简单的例子来说明如何做到这一点


有谁能提供我如何加密可转换属性的示例代码,使其无法以任何方式读取

您可以执行此处所示的操作

将新的Objective-C文件添加到project select category,NSData类将其称为Additions

NSData+Additions.h

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>

@interface NSData (Additions)

#pragma mark - data encryption

+ (NSData *)encrypt:(NSData *)plainText key:(NSData *)key iv:(NSData *)iv;
+ (NSData *)decrypt:(NSData *)encryptedText key:(NSData *)key iv:(NSData *)iv;

+ (NSData *)dataFromHexString:(NSString *)string;
+ (NSData *)sha256forData:(id)input;

+ (NSData *)generateRandomIV:(size_t)length;

@end
然后通过SHA256创建盐字符串的NSData表示

NSData *hash = [NSData sha256forData:CC_SALTED_STRING];
下一步是生成16字节随机生成的iVector数据

NSData *iVector = [NSData generateRandomIV:16];
并使用这些对象加密字符串。使用iVector数据的前16个字节创建一个NSMutableData对象(确保使用iVector对象并且不生成新的随机数据,否则将无法解密)

要解密,请分离前16个字节和其余数据,并将其与哈希一起使用

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];
您可以在散列上执行一些额外的md5操作,甚至可以在存储加密数据之前使用zlib对其进行打包


享受您定制的加密功能。

我现在将尝试实现这一功能……希望我能设法让它发挥作用。我感谢您的时间和努力。我在文件NSData+Base64.m中发现了一系列错误。首先,编译器抱怨第25行返回[result autorelease];在更改该行以返回结果之后;我得到警告@implementation NSData(Base64)方法定义Base64 EncodingStringwithSeparateLines not found,并在这一行下面堆了一个错误…再次提到这一点…我正在处理OS-X应用程序我没有使用Base64。试试我写的实现。那就足够满足你的需要了。我的方法可能会根据我的需要稍作修改。但是我写的代码是独立工作的,不需要使用Base64我还有一个问题……我使用绑定来插入和读取数据。我如何用绑定实现您的代码?您知道为什么行NSData*hash=[NSData sha256forData:CC_SALTED_STRING];生成警告“格式字符串未使用数据参数”?
NSData *iVector = [NSData generateRandomIV:16];
NSString *message = @"my secret message to the world";
NSData *messageData = [message dataUsingEncoding:NSUTF8StringEncoding];

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

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

[encryptedData appendData:payLoad];
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];