Сегодня мне нужно было внедрить md5-хэширование паролей в базе данных приложения для iPhone. Работа с базой осуществляется через уже описанную Objective-C ORM*-библиотеку*. Соответственно, и хэшировать очень хотелось какими-нибудь стандартными средствами Objective-C. Для решения поставленной задачи был произведен непродолжительный поиск в интернете, и найдено решение, которое на удивление точно подошло. На удивление – потому что когда я хотел хэшировать md5 средствами C#, то я нашел как минимум три хоть и очень похожих, но дающих разный результат методов реализации. А найденное мною решение для Objective-C выдает результат такой же, как и выбранный метод на C#, что не могло меня не обрадовать.
Вот это решение:
Файл MyExtensions.h:
@interface NSString (MyExtensions)
- (NSString *) md5;
@end
@interface NSData (MyExtensions)
- (NSString*)md5;
@end
Файл MyExtensions.m:
#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, становится возможным следующий вызов:
NSString* s = @”Hash”;
NSString* hash = [s md5];
Удобно, не правда ли? Ну и, раз результат этого метода совпадает для уже описанного md5-хэширования на C#, можно понять, что после выполнения указанного кода в строке hash будет содержаться fae8a9257e154175da4193dbf6552ef6 (что по образцу предыдущего поста об md5 также вынесено в качестве картинки-иллюстрации в начале поста).
Полезная статья? Их будет больше, если вы поддержите меня!