web-dev-qa-db-ja.com

ココアの文字列にMD5ハッシュを使用していますか?

可能性のある複製:
Objective CのMD5アルゴリズム

ココアでMD5技術を使用して文字列をハッシュする必要があります。使用されるフレームワークは、iPhoneでアクセスできる必要があります。可能であればコードを提供してください。

42
zpesk

まず、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);

iPhoneでMD5を計算

36
Chad Birch

Facebook Connectのソースコードでこれに気づきました。かなりしっかりしているようで、試してみてください。

#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;
}
...
67
Jackie Treehorn

これは私が使用するものです。クレジットは 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なしで機能します

19
bentford

OpenSSLメソッドは、OS Xのより新しいバージョンでは非推奨であり、MD5ダイジェストは従来より小文字であることに言及する価値があります。個人的に私は効率のために展開されたスタイルのファンであり、これにObjCカテゴリを使用する方が適していると思います。

MD5Digest.hの場合:#include

@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
10
Tom M

「NSString + MyGoonk」カテゴリに次を追加しました。

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

2つのこと:

  1. これは、文字列がUTF8であることを前提としています。それをより一般的なものにする方法があると確信していますが、私は他のものをほとんど使用しません。

  2. -lcryptoをプロジェクトにリンクする必要があります。

6
MarcWan

これを理解しようとしてあまりにも多くの時間を費やした後、正しいコードとその使用方法を含む包括的な投稿を作成しました。このブログの投稿をご覧ください。 http://www.saobart.com/md5-has-in-objective-c/

6
Chris Beaven

MD5は暗号化ではなく、 暗号化ハッシュ関数 です。これは、出力が128ビットの数値である一方向関数です。それがcryptographicであるという事実は、MD5ハッシュ出力が与えられると、MD5がその値である文字列を計算することは計算上困難な問題であることを意味します。そのため、MD5はデータの整合性チェックに使用できますが、暗号化には使用できません。

3
Adam Rosenfield