ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 3

16. Шифрование

Хеширование

В наше время вопрос шифрования очень актуальный. Особенно при передаче данных на сервер. Такие данные обычно передаются в виде строк. Значит вопрос защиты сводится к шифрованию этих строк. В этом примере я продемонстрирую шифрование двумя известными способами (MD5 и SHA1). Реализуем мы это с помощью категорий. Поэтому перед тем как приступить к реализации этого примера советую прочитать вот этот урок.

В первую очередь создадим проект на основе представления (View-based Application) и назовем его myCrypto. Теперь добавим в только что созданный проект новый класс и назвем его CryptoSupport (если вы забыли как это делать — можно посмотреть в примереСвои ячейки (custom cell), в нем мы создавали отдельный класс для ячеек). В этот класс мы поместим функции шифрования и сделаем его категорией класса NSString. Вот как будет выглядеть интерфейс класса CryptoSupport:

<code data-result="[object Object]">@interface NSString (CryptoString)

- (NSString*)MD5;
- (NSString*)SHA1;

@end</code>

 

В скобках после указания типа категории мы указываем ее имя. Оно указывается произвольно. А вот так выглядит реализация класса CryptoSupport:

<code data-result="[object Object]">#import &lt;CommonCrypto/CommonDigest.h&gt;
#import "CryptoSupport.h"

@implementation NSString (CryptoString)

- (NSString *)MD5 {
    const char *cStr = [self UTF8String];
    unsigned char result[16];
    CC_MD5( cStr, strlen(cStr), result);
    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]
            ];  
}

-(NSString*)SHA1 {
    NSData *data = [self dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(data.bytes, data.length, digest);
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

    for(int i = 0; i &lt; CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];

    return output;
}

@end</code>

Я не буду описывать, что происходит в этих методах, да это не так уж и важно. Главное, что они работают. Чтобы проверить их работоспособность импортируем класс CryptoSupport в myCryptoViewController (в интерфейсе классаmyCryptoViewController добавьте строчку #import «CryptoSupport.h»). А в реализации класса myCryptoViewController изменим метод viewDidLoad.

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *str = @"imaladec.com";
    NSLog(@"%@", str);
    NSLog(@"MD5:%@", [str MD5]);
    NSLog(@"SHA1:%@", [str SHA1]);
}</code>

 

Результат выполнения такого кода выглядеть вот так:

 

imaladec.com

MD5:d313314fdf1427fe961bd415830e3c9e

SHA1:c8eca0af2ff05b6e0be47eb16fc3061f27434919

 

Теперь зашифрованную строку можно передавать на сервер.

Конечно, это не совершенный способ шифрования, но он предостережет вашу программу от взлома начинающих хакеров.

Исходный код этого проекта можно скачать здесь. Если вам понадобится отдельно класс CryptoSupport, можете скачать его здесь.

Comments are closed.