在cocoa的string上使用MD5哈希?

可能重复:
目标C中的MD5algorithm

我需要在cocoa中使用MD5技术来散列string。 任何使用的框架必须能够在iPhone上访问。 请尽可能提供代码。

那么首先,MD5不是encryption的。 所以,如果你正在寻找encryption,你看错了地方。

但是如果你只是想在iPhone上使用MD5进行散列,这应该给你所需的信息:

#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); 

(从iPhone上计算MD5 )

在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; } ... 

这是我用的。 积分去Alistair McMillan 。

 #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:我无法find-lcrypto在iPhone上的外部框架列表,这个工程没有-lcrypto

值得一提的是,在较新版本的OS X上,OpenSSL方法已被弃用,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]; } 

两件事情:

  1. 这假定你的string是UTF8。 我相信有一种方法可以使其更通用,但我几乎从不使用其他任何东西。

  2. 您必须将-lcrypto链接到您的项目中。

花费了太多的时间来解决这个问题之后,我用正确的代码做了一个全面的文章,以及如何使用它。 你可以在我的博客上find这个post。 http://www.saobart.com/md5-has-in-objective-c/

MD5不是encryption,它是一个密码散列函数 。 这是一个单向函数,其输出是一个128位的数字。 事实上,它是密码意味着这是一个计算困难的问题,给定一个MD5散列输出,计算一个string的MD5是该值。 所以,MD5可以用于数据完整性检查,但不能用于encryption。