2013年4月11日木曜日

Message digests (MD5, SHA1, etc.) on iOS with dedicated classes

Project nv-ios-digest (Apache License, Version 2.0) provides Objective-C classes that are dedicated to computation of message digests such as MD5 and SHA-1. An example code below prints MD5 hash value of "Hello, world.".

// Create an MD5 instance using the convenience constructor.
MD5 *md5 = [MD5 md5WithString:@"Hello, world."];

// Print the MD5 hash value as string.
// This will show "md5 = 080aef839b95facf73ec599375e92d47".
NSLog(@"md5 = %@", md5);


Another example code below shows another different way to compute MD5 with update and final.

// Create MD5 instance for computation.
md5 = [[MD5 alloc] init];

// Update. See also
// updateWith:(const void *)data length:(CC_LONG)length
[md5 updateWithString:@"Hello, world."];

// Final. The returned pointer points to the internal buffer
// of md5 whose size is CC_MD5_DIGEST_LENGTH (=16).
unsigned char *md = [md5 final];

// After 'final', a valid NSString expression is available
// through 'description' method.
NSLog(@"md5 = %@", md5);


Supported algorithms are as follows.

  • MD5
  • SHA1
  • SHA224
  • SHA256
  • SHA384
  • SHA512

A simple implementation to add md5 method to NSString will look like the following.

// NSString+MessageDigest.h
#import <Foundation/Foundation.h>
#import "MD5.h"
@interface NSString (MessageDigest)
- (MD5 *)md5;
@end

// NSString+MessageDigest.m
#import "NSString+MessageDigest.h"
@implementation NSString (MessageDigest)
- (MD5 *)md5
{
    return [MD5 md5WithString:self];
}
@end

And its usage will be:

#import "NSString+MessageDigest.h"

NSLog(@"md5 = %@", @"Hello, world.".md5);


Project Page
https://github.com/TakahikoKawasaki/nv-ios-digest



iOS におけるメッセージダイジェスト (MD5, SHA1, 他) の計算

nv-ios-digest (Apache License, Version 2.0) プロジェクトには、MD5 や SHA-1 などのメッセージダイジェスト計算に特化した Objective-C クラス群が含まれています。次の例では "Hello, world." の MD5 ハッシュ値を出力しています。

// コンビニエンスコンストラクタを用いて MD5 インスタンスを作成する。
MD5 *md5 = [MD5 md5WithString:@"Hello, world."];

// MD5 ハッシュ値を文字列として出力する。
// "md5 = 080aef839b95facf73ec599375e92d47" が出力される。
NSLog(@"md5 = %@", md5);


次の例では、updatefinal を用いて MD5 を計算する別の方法を示しています。

// MD5 のインスタンスを作成する。
md5 = [[MD5 alloc] init];

// 更新する。updateWith:(const void *)data length:(CC_LONG)length も
// 参照のこと。
[md5 updateWithString:@"Hello, world."];

// 最終処理をおこなう。返却されるポインターは md5 の内部バッファーを
// 指しており、そのサイズは CC_MD5_DIGEST_LENGTH (=16)。
unsigned char *md = [md5 final];

// final 実行後、description メソッドで有効な NSString を取得できる。
NSLog(@"md5 = %@", md5);


下記のアルゴリズムがサポートされています。

  • MD5
  • SHA1
  • SHA224
  • SHA256
  • SHA384
  • SHA512

md5 メソッドを NSString に追加する簡易実装は次のようになります。

// NSString+MessageDigest.h
#import <Foundation/Foundation.h>
#import "MD5.h"
@interface NSString (MessageDigest)
- (MD5 *)md5;
@end

// NSString+MessageDigest.m
#import "NSString+MessageDigest.h"
@implementation NSString (MessageDigest)
- (MD5 *)md5
{
    return [MD5 md5WithString:self];
}
@end

使い方は次のとおり:

#import "NSString+MessageDigest.h"

NSLog(@"md5 = %@", @"Hello, world.".md5);


プロジェクトページ
https://github.com/TakahikoKawasaki/nv-ios-digest