代码之家  ›  专栏  ›  技术社区  ›  zpesk

在cocoa中对字符串使用MD5哈希?[副本]

  •  42
  • zpesk  · 技术社区  · 15 年前

    可能重复:
    MD5 algorithm in Objective C

    7 回复  |  直到 7 年前
        1
  •  67
  •   Jackie Treehorn    14 年前

    #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;
    }
    ...
    
        2
  •  36
  •   mxcl    10 年前

    首先,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);
    

    (来自 Calculate MD5 on iPhone )

        3
  •  19
  •   bentford Marko Hlebar    14 年前

    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,它也可以工作

        4
  •  10
  •   Tom M    13 年前

    值得一提的是,OpenSSL方法在较新版本的OS X上已被弃用,而MD5摘要通常是小写的。就我个人而言,为了提高效率,我更喜欢展开式,我认为使用ObjC类别更合适。

    对于MD5Digest.h: #包括

    @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
  •  6
  •   MarcWan    15 年前

    #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. 这假设您的字符串是UTF8。我确信有一种方法可以使它更通用,但我几乎从不使用其他任何东西。

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

        6
  •  6
  •   Chris Beaven    14 年前

    在花了太多时间试图弄明白这一点之后,我发表了一篇全面的文章,其中包含了正确的代码以及如何使用它。你可以在我的博客上找到这篇文章。 http://www.saobart.com/md5-has-in-objective-c/

        7
  •  3
  •   Adam Rosenfield    15 年前

    MD5不是加密,它是一个 cryptographic hash function . 这是一个单向函数,其输出为128位数字。事实是 加密 这意味着,给定MD5哈希输出,计算MD5为该值的字符串是一个计算困难的问题。因此,MD5可以用于数据完整性检查,但不能用于加密。