Getting MD5 and SHA-1

11

我需要帮助在我的 iPhone 应用中获取 MD5 和 SHA-1。 有人能给我一个获取这些的思路吗?


1
@Paul:SO正在努力整合所有信息,以便谷歌将人们带到这里。http://meta.stackexchange.com/questions/87652/discourage-google-for-it-answers - jscs
1个回答

17
#include <CommonCrypto/CommonDigest.h>

-(NSString*) sha1:(NSString*)input
{

 NSData *data = [input dataUsingEncoding: NSUTF8StringEncoding]; 

 uint8_t digest[CC_SHA1_DIGEST_LENGTH];

 CC_SHA1(data.bytes, data.length, digest);

 NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

 for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
 [output appendFormat:@"%02x", digest[i]];

 return output;

}

- (NSString *) md5:(NSString *) input
{
 const char *cStr = [input UTF8String];
 unsigned char digest[CC_MD5_DIGEST_LENGTH];
 CC_MD5( cStr, (CC_LONG)strlen(cStr), digest ); // This is the md5 call

 NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

 for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
 [output appendFormat:@"%02x", digest[i]];

 return  output;

}

还可以看一下我在这里发布的博客文章 - http://www.makebetterthings.com/blogs/iphone/how-to-get-md5-and-sha1-in-objective-c-ios-sdk/


1
不要忘记在你的实现代码顶部添加 #import <CommonCrypto/CommonDigest.h>。无需链接 libcommonCrypto.dylib - Raptor
为什么你要用CC_SHA1_DIGEST_LENGTH*2来初始化mutableString,而不是使用[NSMutableString string]呢? - Oliver
这行代码 NSData *data = [NSData dataWithBytes:cstr length:input.length]; 对于非ASCII字符串会出错。我建议使用strlen(cstr)代替input.length。 - Lukas Petr
是的,sha1方法的前两行确实无法处理像卷曲引号这样的Unicode字符。我通过将这两行替换为以下代码来解决了这个问题:NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding]; - lifjoy
@lifjoy - 感谢您指出这一点。我刚刚更新了答案。再次感谢! - Saurabh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接