Возможный дубликат:
MD5-алгоритм в Objective C
Мне нужно записать строку с использованием метода MD5 в cocoa. Любые фреймворки, которые используются, должны быть доступны на iphone. пожалуйста, предоставьте код, если это возможно.
Возможный дубликат:
MD5-алгоритм в Objective C
Мне нужно записать строку с использованием метода MD5 в cocoa. Любые фреймворки, которые используются, должны быть доступны на iphone. пожалуйста, предоставьте код, если это возможно.
Ну, во-первых, MD5 не шифрует. Поэтому, если вы ищете шифрование, вы ищете не то место.
Но если вы просто хотите хешировать что-то, используя MD5 на iPhone, это должно предоставить вам необходимую информацию:
#import <CommonCrypto/CommonDigest.h>
NSString *md5(NSString *str) {
const char *cStr = [str UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
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 *digest = md5(@"test");
NSLog(@"MD5 TEST %@", digest);
Отмечено это в исходном коде Facebook Connect. Выглядит довольно солидно, дайте ему шанс.
#import <CommonCrypto/CommonDigest.h>
...
+ (NSString*)md5HexDigest:(NSString*)input {
const char* str = [input UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, strlen(str), result);
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
[ret appendFormat:@"%02x",result[i]];
}
return ret;
}
...
Это то, что я использую. Кредиты идут в Алистер Макмиллан.
#import <CommonCrypto/CommonDigest.h>
+ (NSString *) md5:(NSString *)str {
const char *cStr = [str 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]
];
}
ПРИМЕЧАНИЕ # 1: мне не нужно было ссылаться на какие-либо библиотеки
ПРИМЕЧАНИЕ # 2: я не смог найти -lcrypto во внешнем фреймворке на iphone, и это работает без -lcrypto
Стоит отметить, что методы OpenSSL устарели в более поздних версиях OS X, а дайджест MD5 обычно является строчным. Лично я больше поклонник разворачиваемого стиля для эффективности, и я думаю, что использование категорий ObjC для этого лучше подходит.
Для MD5Digest.h: #include
@interface NSString (MD5Digest)
- (NSString*) md5Digest;
@end
@interface NSData (MD5Digest)
- (NSString*) md5Digest;
@end
И MD5Digest.m:
#include <CommonCrypto/CommonDigest.h>
#include "MD5Digest.h"
static NSString* md5Digest(const void *data, CC_LONG length)
{
unsigned char digest[CC_MD5_DIGEST_LENGTH];
unsigned char* d = CC_MD5(data, length, digest);
return [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15],
nil];
}
@implementation NSString (MD5Digest)
- (NSString*) md5Digest
{
return md5Digest([self UTF8String], [self lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
}
@end
@implementation NSData (MD5Digest)
- (NSString*) md5Digest
{
return md5Digest([self bytes], [self length]);
}
@end
Я добавил следующее в категорию "NSString + MyGoonk":
#include <openssl/md5.h>
- (NSString *)md5
{
NSData *data = [self dataUsingEncoding: NSUTF8StringEncoding];
unsigned char *digest = MD5([data bytes], [data length], NULL);
return [NSString stringWithUTF8String: (char *)digest];
}
Две вещи:
это предполагает, что ваша строка - UTF8. Я уверен, что есть способ сделать его более общим, но я почти никогда не использую ничего другого.
вам нужно связать -lcrypto с вашим проектом.
Проведя слишком много времени, пытаясь понять это, я сделал всеобъемлющую запись с правильным кодом и тем, как использовать его. Вы можете найти сообщение здесь в своем блоге. http://www.saobart.com/md5-has-in-objective-c/
MD5 не является шифрованием, это криптографическая хэш-функция. Это односторонняя функция, выход которой - 128-битное число. Тот факт, что он является криптографическим, означает, что это сложная вычислительная проблема, которая, учитывая выход хэш файла MD5, вычисляет строку, MD5 которой это значение. Таким образом, MD5 может использоваться для проверки целостности данных, но не для шифрования.