Сегодня мне нужно было внедрить md5-хэширование паролей в базе данных приложения для iPhone. Работа с базой осуществляется через уже описанную Objective-C ORM-библиотеку. Соответственно, и хэшировать очень хотелось какими-нибудь стандартными средствами Objective-C. Для решения поставленной задачи был произведен непродолжительный поиск в интернете, и найдено решение, которое на удивление точно подошло. На удивление – потому что когда я хотел хэшировать md5 средствами C#, то я нашел как минимум три хоть и очень похожих, но дающих разный результат методов реализации. А найденное мною решение для Objective-C выдает результат такой же, как и выбранный метод на C#, что не могло меня не обрадовать.
Вот это решение:
Файл MyExtensions.h:
1 2 3 4 5 6 7 |
@interface NSString (MyExtensions) - (NSString *) md5; @end @interface NSData (MyExtensions) - (NSString*)md5; @end |
Файл MyExtensions.m:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#import "MyExtensions.h" #import <CommonCrypto/CommonDigest.h> // Необходимо для доступа к CC_MD5 @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 |
В нем используется возможность создания расширений для стандартных типов данных Cocoa. Благодаря этому, после подключения файла MyExtension.h, становится возможным следующий вызов:
1 2 |
NSString* s = @”Hash”; NSString* hash = [s md5]; |
Удобно, не правда ли? Ну и, раз результат этого метода совпадает для уже описанного md5-хэширования на C#, можно понять, что после выполнения указанного кода в строке hash будет содержаться fae8a9257e154175da4193dbf6552ef6 (что по образцу предыдущего поста об md5 также вынесено в качестве картинки-иллюстрации в начале поста).
Полезная статья? Их будет больше, если вы поддержите меня!