Objective-CのMD5アルゴリズム


回答:


219

md5はiPhoneで利用でき、ie NSStringなどの追加としてNSData以下に追加できます。

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]; そして、はい、これはファイル全体をメモリに引き出します。ファイルストリームで機能するソリューションを見つけた場合は、回答として投稿してください。
Klaas 2013

1
ファイルをハッシュする必要がある場合は、CC_MD5_Initを使用してから、すべてのファイルデータにCC_MD5_Updateを使用し、その後にCC_MD5_Finishを使用する必要があります。
Nickolay Olshevsky 2013

7
64ビットアーキテクチャ用にコンパイルするstrlenと、次の警告が表示されます:「暗黙の変換では整数の精度が失われます: 'unsigned long'から 'CC_LONG'(別名 'unsigned int')」
MaxGabriel

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)、digest)---->この行は、EXC_BAD_ACCESSと言って例外をスローしています)
Nilesh Kumar

@wimcNilesh self実行前に確認します。自己がnilの場合、クラッシュします。
brandonscript 2014年

4
この回答は、他の回答よりも読みやすくなっています。必要なものの1つは、(int)前にキャストすることです。strlen例:(int)strlen...
brandonscript

ヘイこれは良い+1賛成票です。そして、あなたの暗号化と同じmd5復号化方法も提供してください。
Ayaz 2014年

@Ayaz MD5は復号化できません(少なくともメソッドを使用して)。
albanx

9

パフォーマンスが重要な場合は、この最適化されたバージョンを使用できます。stringWithFormatまたはを使用したものより約5倍高速です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

Apple実装を使用しない理由:https : //developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid/TP40011172-CH9-SW1

Apple開発者向けサイトで暗号化サービスガイドを検索します。


リンクは、ここでの答えのほとんどが利用する一般的な暗号をカバーしています。
zaph 2015年

1
確かにアルゴは同じです。ただし、独自の暗号アルゴリズムを実装すると欠陥が生じる可能性があることに注意してください。すべてのシナリオで正しく機能させるには、かなりの強化が必要です。したがって、一般的なケースでは、ライブラリバージョンを使用することをお勧めします。
vpathak 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.