2012-03-02 3 views
2

У меня есть база данных SQLite, которая содержит конфиденциальную информацию. Поэтому я обеспокоен тем, как сохранить его на iPhone, чтобы он был безопасным, и хакеры не могли его получить. Я искал аппаратное шифрование, предоставляемое ipad, но не мог понять, как его использовать. Любая помощь приветствуется ...Как безопасно хранить базу данных SQLite в iphone ..?

+1

Вы можете зашифровать его и дешифровать при чтении. Если ваше приложение не является открытым исходным кодом, и вам не нужно указывать другим метод шифрования, любой алгоритм, который вы используете, будет enougth даже простым xor. – jcubic

ответ

2

Вы можете посмотреть на разные подходы к разуму вашей проблемы.

  • Шифрование значений, хранящихся в CoreData с использованием шифрования md5 + salt. Вы можете создать специальный ключ на основе пользовательского UUID устройства и некоторую дополнительную «соль» для хранения данных. Будьте осторожны, Apple в будущем будет обесценивать значения персонализации устройства. Но с другой стороны, вы можете получить специальный ключ путем аутентификации пользователя и получить этот ключ из почтового запроса. Для шифрования вы можете использовать встроенную структуру: #import <CommonCrypto/CommonDigest.h>. Есть много примеров, которые вы можете найти в Интернете.

  • Зашифровать весь файл sqlite в папке с документами. Это может быть довольно сложно, и я не сталкивался с подобным подходом раньше.

EDIT: Это пример кода, который можно использовать для получения зашифрованного с данными md5: Это .h файл

#import <Foundation/Foundation.h> 

@interface NSString (MyExtensions) 
- (NSString *) md5; 
@end 

@interface NSData (MyExtensions) 
- (NSString *)md5; 
@end 

это .m файл:

#import "MyExtensions.h" //here should be your .h file name 
#import <CommonCrypto/CommonDigest.h> // Need to import for CC_MD5 access 

@implementation NSString (MyExtensions) 
- (NSString *) md5 
{ 
    const char *cStr = [self UTF8String]; 
    unsigned char result[16]; 
    CC_MD5(cStr, strlen(cStr), result); // This is the md5 call 
    return [NSString stringWithFormat: 
      @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", 
      result[0], result[1], result[2], result[3], 
      result[4], result[5], result[6], result[7], 
      result[8], result[9], result[10], result[11], 
      result[12], result[13], result[14], result[15] 
      ]; 
} 
@end 

@implementation NSData (MyExtensions) 
- (NSString *)md5 
{ 
    unsigned char result[16]; 
    CC_MD5(self.bytes, self.length, result); // This is the md5 call 
    return [NSString stringWithFormat: 
      @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", 
      result[0], result[1], result[2], result[3], 
      result[4], result[5], result[6], result[7], 
      result[8], result[9], result[10], result[11], 
      result[12], result[13], result[14], result[15] 
      ]; 
} 
@end 

Итак, если вы включите эти файлы в любое место своего кода, вы можете просто вызвать эту функцию:

NSString *myStringToEncrypt = @"Confidential information"; 
NSString *myMD5 = [myStringToEncrypt md5]; 

btw: вы должны знать, что Функция MD5 - это просто хеш-функция, которая возвращает вам контрольную сумму данных. Если вы хотите шифровать, вы можете посмотреть на AES256 метод шифрования. CommonCrypto также предоставляет его. Подход зависит от ваших целей.

+0

Где я могу получить более подробную информацию или образец на ...? Я пытался использовать CCCrypt, но серьезно не могу найти документацию, как ее использовать. –

+0

Я могу предоставить вам код фрагмента, который я использовал в своем проекте. Подождите минуту :) – kokoko

+0

Я добавил несколько образцов кода для вас. – kokoko

0

Я думаю, вы можете создать защищенный паролем zip-файл своей базы данных. Вы можете разархивировать его, когда вам это нужно.

+0

Насколько я слышал, защищенные паролем ZIP-файлы можно легко разблокировать, если у вас довольно быстро компьютер. Моя главная проблема - кража устройства. Посмотрите, украден ли устройство, есть ли способы получить доступ к этой базе данных, поэтому я изучаю AES-шифрование с аппаратным ускорением, я слышал, что это очень хорошо, даже если устройство украдено. –

+0

Если вы выберете хороший пароль для защиты, это будет сложно взломать. AES Шифрование, конечно, очень хорошо. Но каждый раз, когда вы шифруете/дешифруете всю базу данных, он будет потреблять много процессорного времени. Я чувствую, что это довольно неэффективно. – Vignesh

+0

Я не думал об шифровании/расшифровке всей базы данных каждый раз, я знаю, что это будет очень неэффективно, я думал, что это какая-то блокировка в базе данных, которая блокирует базу данных ... SQLCipher кажется приятным вариант, предложенный hburde ... но спасибо в любом случае. –

1

Вы можете использовать http://sqlcipher.net/ (SQLLite с AES Encryption), но это имеет некоторые серьезные последствия (экспорт ограничений и не интегрируется с CoreData).