Подтвердить что ты не робот

Использование хеша MD5 в строке в cocoa?

Возможный дубликат:
MD5-алгоритм в Objective C

Мне нужно записать строку с использованием метода MD5 в cocoa. Любые фреймворки, которые используются, должны быть доступны на iphone. пожалуйста, предоставьте код, если это возможно.

4b9b3361

Ответ 1

Ну, во-первых, 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);

(Из Рассчитать MD5 на iPhone)

Ответ 2

Отмечено это в исходном коде 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;
}
...

Ответ 3

Это то, что я использую. Кредиты идут в Алистер Макмиллан.

#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

Ответ 4

Стоит отметить, что методы 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

Ответ 5

Я добавил следующее в категорию "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 с вашим проектом.

Ответ 6

Проведя слишком много времени, пытаясь понять это, я сделал всеобъемлющую запись с правильным кодом и тем, как использовать его. Вы можете найти сообщение здесь в своем блоге. http://www.saobart.com/md5-has-in-objective-c/

Ответ 7

MD5 не является шифрованием, это криптографическая хэш-функция. Это односторонняя функция, выход которой - 128-битное число. Тот факт, что он является криптографическим, означает, что это сложная вычислительная проблема, которая, учитывая выход хэш файла MD5, вычисляет строку, MD5 которой это значение. Таким образом, MD5 может использоваться для проверки целостности данных, но не для шифрования.