2009-03-16 37 views
42

thể trùng lặp:
MD5 algorithm in Objective CSử dụng hàm băm MD5 trên một chuỗi trong ca cao?

tôi cần phải băm một chuỗi bằng cách sử dụng kỹ thuật MD5 trong cacao. Mọi khung công tác được sử dụng phải có khả năng truy cập được trên iphone. vui lòng cung cấp mã nếu có thể.

+1

nếu có thể, không sử dụng md5 nhưng một sha-băm. MD5 được coi là bị hỏng. –

+6

MD5 không phải là "bị hỏng", có một lỗ hổng cụ thể cho phép bạn tạo xung đột khi bạn đã có khá nhiều thông tin về dữ liệu bị băm. Nó vẫn là một lựa chọn hoàn hảo hợp lệ cho các ứng dụng như xác minh mật khẩu (mặc dù sử dụng muối luôn là một ý tưởng tốt). –

+2

Sử dụng MD5 cho mục đích mã hóa là không khôn ngoan. Dưới đây là cách sao chép mã băm MD5: http://www.mscs.dal.ca/~selinger/md5collision/ Các công cụ này mất vài giờ trên hộp PC-class. Dưới đây là cách giả mạo chứng chỉ kỹ thuật số MD5: http://www.schneier.com/crypto-gram-0901.html Dưới đây là một số chi tiết khác về các cuộc tấn công: http://www.schneier.com/blog/ lưu trữ/2005/06/more_md5_collis.html –

Trả lời

36

Vâng, trước hết, MD5 không phải là mã hóa. Vì vậy, nếu bạn đang tìm kiếm mã hóa, bạn đang tìm kiếm địa điểm sai.

Nhưng nếu bạn chỉ muốn băm cái gì đó sử dụng MD5 trên iPhone, điều này sẽ cung cấp cho bạn những thông tin bạn cần:

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

(Từ Calculate MD5 on iPhone)

+43

Đúng, nhưng -1. Tôi sử dụng stackoverflow để tránh các trang web diễn đàn khác. Vui lòng xem xét đăng câu trả lời thực tế thay vì liên kết. – bentford

3

MD5 không mã hóa, nó là một cryptographic hash function. Đó là chức năng một chiều có đầu ra là một số 128 bit. Thực tế là nó là mật mã có nghĩa là nó là một vấn đề khó tính toán, với một đầu ra băm MD5, tính toán một chuỗi có MD5 là giá trị đó. Vì vậy, MD5 có thể được sử dụng để kiểm tra tính toàn vẹn dữ liệu, nhưng không phải để mã hóa.

+1

Cần lưu ý rằng MD5 đã bị xâm nhập để không còn khả năng tấn công nó nữa. Điều đó có thể không quan trọng tùy thuộc vào những gì bạn đang sử dụng nó cho, nhưng nó có giá trị giữ trong tâm trí. http://en.wikipedia.org/wiki/MD5#Vulnerability –

+8

Cần lưu ý rằng áp phích gốc không yêu cầu mã hóa… –

+1

Ban đầu họ đã làm như vậy. – Joe

6

tôi đã thêm dòng sau vào tôi "NSString + MyGoonk" thể loại:

#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]; 
} 

Hai điều:

  1. này giả định chuỗi của bạn là UTF8. Tôi chắc chắn có một cách để làm cho nó chung chung hơn, nhưng tôi gần như không bao giờ sử dụng bất cứ điều gì khác.

  2. bạn phải liên kết -lcrypto vào dự án của bạn.

+0

Điều này không được chấp nhận khi khởi động OS X 10.7. – Pripyat

19

Đây là những gì tôi sử dụng. Tín dụng đi đến số 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] 
    ]; 
} 

Chú ý # 1: Tôi không có liên kết đến bất kỳ thư viện

Chú ý # 2: Tôi không thể tìm thấy -lcrypto trong danh sách khung bên ngoài trên iphone, và điều này hoạt động mà không có -crypto

6

Sau khi dành quá nhiều thời gian để tìm hiểu điều này, tôi đã tạo một bài đăng toàn diện với mã chính xác và cách sử dụng nó. Bạn có thể tìm thấy bài đăng ở đây trên blog của tôi. http://www.saobart.com/md5-has-in-objective-c/

+0

Cảm ơn. Rất hữu ích. – znq

+0

Cảm ơn người đàn ông. Tôi nghĩ đây là câu trả lời đúng. – itsaboutcode

+0

Cần lưu ý rằng giải pháp này giống với mã tôi đã đăng ở trên. – bentford

67

Nhận thấy điều này trong mã nguồn Facebook Connect. Trông khá chắc chắn, cho nó một shot.

#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; 
} 
... 
+9

+1 điều này về cơ bản tương đương với đoạn mã của tôi ở trên, nhưng trông hơi sạch hơn một chút. – bentford

+3

@bentford: Các giải pháp làm sạch tốt hơn. – FreeAsInBeer

+1

Để tắt cảnh báo trong XCode cast 'strlen (str)' thành '(CC_LONG) strlen (str)' – Jasper

10

Điều đáng nói là các phương pháp OpenSSL không được chấp nhận trên các phiên bản OS X mới hơn và thông báo MD5 là trường hợp thường thấp hơn. Cá nhân tôi là một fan hâm mộ của phong cách unrolled cho hiệu quả, và tôi nghĩ rằng bằng cách sử dụng các loại ObjC cho điều này là phù hợp hơn.

Đối với MD5Digest.h: #include

@interface NSString (MD5Digest) 
- (NSString*) md5Digest; 
@end 

@interface NSData (MD5Digest) 
- (NSString*) md5Digest; 
@end 

Và 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 
+0

Để sửa lỗi cảnh báo trình biên dịch và vấn đề tiềm ẩn với dữ liệu> 4GB tôi đã sử dụng: return md5Digest ([self bytes], (CC_LONG) MIN (UINT32_MAX, [chiều dài tự])); – dbainbridge

Các vấn đề liên quan