このソリューションは、コアデータを保持し、コンテンツの暗号化を提供するのに役立つ可能性があります。
MyDataという名前のCoreDataオブジェクトが1つの属性MyDataを持っているとしましょう。次に、CoreDataモデルでこの属性のプロパティtransientを設定します。次に、属性タイプBinaryDataを使用して2番目の属性MySecretDataを定義します。これは、実際のデータが保存される場所です。
次に、NSManagedObjectサブクラスに次のようなカテゴリを作成します。
@interface MyObject (Access)
- (NSData*)myData;
- (void)setMyData:(NSData*)value;
@end
@implementation MyObject (Access)
- (NSData*)MyData {
NSMutableData * tmpValue;
[self willAccessValueForKey:@"MyData"];
tmpValue = [self primitiveValueForKey:@"MyData"];
[self didAccessValueForKey:@"MyData"];
if(!tmpValue) {
NSData *encryptedData = [self valueForKey:@"MySecretData"];
if(encryptedData) {
tmpValue = [NSMutableData dataWithData:encryptedData];
BOOL success = [tmpValue decryptWithKey:nil];
if (!success) {
// Error Handling here
}
tmpValue = [tmpValue zlibInflate];
[self setPrimitiveValue:tmpValue forKey:@"MyData"];
}
else {
tmpValue = nil;
[self setMyData:tmpValue];
}
}
return tmpValue;
}
- (void)setMyData:(NSData *)data {
NSData* tmpValue;
[self willAccessValueForKey:@"MyData"];
tmpValue = [self primitiveValueForKey:@"MyData"];
[self didAccessValueForKey:@"MyData"];
if([tmpValue isEqual:data])
return;
[self willChangeValueForKey:@"MyData"];
[self setPrimitiveValue:data forKey:@"MyData"];
[self didChangeValueForKey:@"MyData"];
NSMutableData* encryptedData = nil;
if (data != nil) {
encryptedData = [NSMutableData dataWithData:data];
encryptedData = [encryptedData zlibDeflate];
BOOL success = [encryptedData encryptWithKey:nil];
if (!success) {
// Error Handling here
}
}
[self setPrimitiveValue:encryptedData forKey:@"MySecretData"];
}
@end
この場合、データは暗号化され、収縮されます。コードから、通常どおりMyDataにアクセスできます。コアデータベース内では、すべての値が暗号化されます。もちろん、適切な暗号化機能を使用する必要があります。