Objective-C'de MD5 algoritması


Yanıtlar:


219

MD5 iPhone'da kullanılabilir ve ie için bir katkı maddesi olarak ilave edilebilir NSStringve NSDataaşağıdaki gibi.

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

DÜZENLE

NSData md5 eklendi çünkü kendime ihtiyacım vardı ve bu küçük snippet'i kaydetmek için iyi bir yer olduğunu düşündüm ...

Bu yöntemler http://www.nsrl.nist.gov/testdata/ adresindeki NIST MD5 test vektörleri kullanılarak doğrulanır.


Bu, tüm dosyayı belleğe alıyor mu?
openfrog

Bu dosyalar ile ilgili değil. Bu yöntemlerle bir dosyadan MD5 oluşturmak istiyorsanız, NSData * fileContents = [NSData dataWithContentsOfFile: @ "<yourPath>"]; NSString * myHash = [fileContents md5]; Ve evet, bu tüm dosyayı belleğe çeker. Dosya akışlarıyla çalışan bir çözüm bulursanız, lütfen yanıt olarak gönderin.
Klaas

1
Karma dosyasına ihtiyacınız varsa, önce tüm dosya verileri için CC_MD5_Init, ardından CC_MD5_Update kullanmalısınız ve bundan sonra - CC_MD5_Finish.
Nickolay Olshevsky

7
64 bit mimari için derleme çağrısı strlenşu uyarıyı verir: "Örtülü dönüşüm tamsayı hassasiyetini kaybeder:" imzasız uzun "ila" CC_LONG "(diğer adıyla" imzasız int ")"
MaxGabriel

55

Bunu yapmak için yerleşik Ortak Kripto kütüphanesini kullanabilirsiniz. İçe aktarmayı unutmayın:

#import <CommonCrypto/CommonDigest.h>

ve sonra:

- (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;
}

Yukarıdaki kodu uyguladım ama uygulamayı çalıştırırken çöküyor (CC_MD5 (cStr, strlen (cStr), özet) ----> bu satır EXC_BAD_ACCESS diyerek istisna atıyor
Nilesh Kumar

@wimcNilesh selfçalıştırmadan önce kontrol edin ; kendini sıfır ise, çökecektir.
brandonscript

4
Bu cevap diğerlerinden daha kolay okunur; ihtiyacı tek şey bir döküm olduğunu (int)daha önce strlenörneğin (int)strlen...
brandonscript

Hay Bu güzel +1 upvote, Ve ayrıca lütfen sizin şifreleme ile aynı md5 Şifre Çözme yöntemi sağlayabilir.
Ayaz

@Ayaz MD5'in şifresi çözülemez (en azından basit bir yöntemle).
albanx

9

Performans önemliyse, bu optimize edilmiş sürümü kullanabilirsiniz. stringWithFormatVeya ile olanlardan yaklaşık 5 kat daha hızlıdır NSMutableString.

Bu bir NSString kategorisidir.

- (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

İnsanlar bir dosya akışı sürümü istediğinden beri. MD5, SHA1 ve SHA512 ile çalışan Joel Lopes Da Silva tarafından yapılan küçük bir parçacığı değiştirdim ve akışları kullanıyor. İOS için üretilmiştir, ancak OSX'te minimum değişikliklerle çalışır (ALAssetRepresentation yöntemini kaldırın). Bir dosya yolu veya ALAssets (ALAssetRepresentation kullanarak) verilen dosyalar için sağlama toplamları yapabilir. Verileri küçük paketlere bölerek, dosya boyutuna / varlık boyutuna bakılmaksızın belleği en aza indirir.

Şu anda burada github'da bulunuyor: https://github.com/leetal/FileHash


Joel'in yayınladığı kodun bir yarış durumu vardır ve sizinki miras alabilir mi? Joel'in gönderisinde yayınladığım yoruma bakın. joel.lopes-da-silva.com/2010/09/07/…
xyzzycoder

Teşekkürler! Şimdi yamalı. Orijinal uygulamada, her zaman özel bir iş parçacığında koştum;)
Alexander W

0

Apple uygulamasını kullanmamak için herhangi bir neden: https://developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid/TP40011172-CH9-SW1

Apple geliştirici sitesinde Şifreleme Hizmetleri Kılavuzu'nu arayın.


Bağlantı, buradaki cevapların çoğunun kullandığı Common Crypto'yu kapsar.
zaph

1
Tabii ki algo aynı. Ancak, kendi kripto algoritmanızın uygulanmasının kusurlara neden olabileceğini unutmayın. Tüm senaryolarda bunu düzeltmek çok zorlaşıyor . Bu nedenle, kütüphane versiyonunun kullanılması, genel durumda tercih edilecektir.
15'te vpathak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.