我需要在cocoa中使用MD5技术散列字符串。必须能够在iphone上访问所使用的任何框架。如果可能请提供代码。
答案 0 :(得分:67)
在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;
}
...
答案 1 :(得分:36)
嗯,首先,MD5不是加密。因此,如果您正在寻找加密,那么您正在寻找错误的地方。
但是如果你只是想在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);
答案 2 :(得分:19)
这就是我使用的。积分转至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:我在iphone的外部框架列表中找不到-lcrypto,这不用-lcrypto
答案 3 :(得分:10)
值得一提的是,在最新版本的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
答案 4 :(得分:6)
我在“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链接到您的项目中。
答案 5 :(得分:6)
花了太多时间试图解决这个问题后,我用正确的代码和如何使用它做了一个全面的帖子。你可以在我的博客上找到这里的帖子。 http://www.saobart.com/md5-has-in-objective-c/
答案 6 :(得分:3)
MD5不是加密,而是cryptographic hash function。它是一个单向函数,其输出是128位数。它是 cryptographic 的事实意味着它是一个计算上很难的问题,在给定MD5哈希输出的情况下,计算其MD5是该值的字符串。因此,MD5可用于数据完整性检查,但不能用于加密。