Objective-C中的MD5算法


Answers:


219

md5在iPhone上可用,并且可以作为ie NSStringNSData如下所示的附加项添加。

MyAdditions.h

@interface NSString (MyAdditions)
- (NSString *)md5;
@end

@interface NSData (MyAdditions)
- (NSString*)md5;
@end

MyAdditions.m

#import "MyAdditions.h"
#import <CommonCrypto/CommonDigest.h> // Need to import for CC_MD5 access

@implementation NSString (MyAdditions)
- (NSString *)md5
{
    const char *cStr = [self UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, (int)strlen(cStr), result ); // This is the md5 call
    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]
        ];  
}
@end

@implementation NSData (MyAdditions)
- (NSString*)md5
{
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5( self.bytes, (int)self.length, result ); // This is the md5 call
    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]
        ];  
}
@end

编辑

添加了NSData md5,因为我自己需要它,并认为这是保存此小片段的好地方...

这些方法已通过http://www.nsrl.nist.gov/testdata/中的NIST MD5测试向量进行了验证


这会将整个文件拉入内存吗?
openfrog

这与文件无关。如果要使用这些方法从文件创建MD5,则可以执行NSData * fileContents = [NSData dataWithContentsOfFile:@“ <yourPath>”]; NSString * myHash = [fileContents md5]; 是的,这会将整个文件拉入内存。如果找到适用于文件流的解决方案,请将其发布为答案。
克拉斯

1
如果需要散列文件,则应使用CC_MD5_Init,然后对所有文件数据使用CC_MD5_Update,然后使用CC_MD5_Finish。
Nickolay Olshevsky

7
针对64位体系结构进行编译,调用会strlen产生警告:“隐式转换会失去整数精度:'unsigned long'到'CC_LONG'(aka'unsigned int')”
MaxGabriel 2014年

55

您可以使用内置的Common Crypto库来执行此操作。记住要导入:

#import <CommonCrypto/CommonDigest.h>

然后:

- (NSString *) md5:(NSString *) input
{
    const char *cStr = [input UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, 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;
}

我实现了上面的代码,但是在运行应用程序时崩溃了(CC_MD5(cStr,strlen(cStr),摘要)---->此行抛出异常,表示EXC_BAD_ACCESS)
Nilesh Kumar

@wimcNilesh self在执行之前检查;如果self为零,它将崩溃。
brandonscript

4
这个答案比其他答案要清晰得多。它需要做的一件事是(int)strlen(int)strlen
强制

Hay这是不错的+1支持,您还可以提供与您的加密相同的md5解密方法。
Ayaz 2014年

@Ayaz MD5无法解密(至少使用一种方法即可)。
albanx

9

如果性能很重要,则可以使用此优化版本。它比那些的速度快5倍stringWithFormat或的NSMutableString

这是NSString的类别。

- (NSString *)md5
{
    const char* cStr = [self UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(cStr, strlen(cStr), result);

    static const char HexEncodeChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    char *resultData = malloc(CC_MD5_DIGEST_LENGTH * 2 + 1);

    for (uint index = 0; index < CC_MD5_DIGEST_LENGTH; index++) {
        resultData[index * 2] = HexEncodeChars[(result[index] >> 4)];
        resultData[index * 2 + 1] = HexEncodeChars[(result[index] % 0x10)];
    }
    resultData[CC_MD5_DIGEST_LENGTH * 2] = 0;

    NSString *resultString = [NSString stringWithCString:resultData encoding:NSASCIIStringEncoding];
    free(resultData);

    return resultString;
}

0

好吧,因为人们要求提供文件流版本。我已经修改了Joel Lopes Da Silva制作的漂亮片段,该片段可与MD5,SHA1和SHA512一起使用,并且正在使用流。它是为iOS制作的,但在OSX上的更改也很小(删除ALAssetRepresentation方法)。它可以对给定文件路径或ALAssets的文件进行校验和(使用ALAssetRepresentation)。它将数据分块到小包装中,无论文件大小/资产大小如何,对内存的影响都最小。

它当前位于github上:https : //github.com/leetal/FileHash


乔尔(Joel)发布的代码具有竞争条件,看起来您的代码可能会继承它。请参阅我在Joel的帖子上发表的评论。joel.lopes-da-silva.com/2010/09/07/...
xyzzycoder

谢谢!立即修补。这对我来说从来都不是问题,因为在原始实现中,我总是在专用线程中运行它;)
Alexander W

0

该链接涵盖了通用加密,此处大多数答案都利用该加密。
zaph

1
确定算法是相同的。但是请注意,实现自己的加密算法可能会引入缺陷。要在所有情况下正确进行校正,需要进行大量的努力。因此,在通常情况下,首选使用库版本。
vpathak 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.