2010-08-12 38 views
29

Làm thế nào để tôi sha1 một chuỗi hoặc tập hợp các số trong Mục tiêu c?Mục tiêu C: SHA1

+0

Câu hỏi này nổi bật tương tự như http://stackoverflow.com/questions/756492/objective-c-sample-code-for-hmac-sha1. Chưa có câu trả lời nào ở đó, nhưng tôi đăng bài vì mục đích hoàn chỉnh. – Eli

+0

Đây có phải là một nền tảng cụ thể không? – ThomasW

+0

@ThomasW Mac os x chỉ – Daniel

Trả lời

61

CommonCrypto (một khuôn khổ Apple) có chức năng tính toán SHA-1 băm, bao gồm một hash một bước:

#include <CommonCrypto/CommonDigest.h> 

unsigned char digest[CC_SHA1_DIGEST_LENGTH]; 
NSData *stringBytes = [someString dataUsingEncoding: NSUTF8StringEncoding]; /* or some other encoding */ 
if (CC_SHA1([stringBytes bytes], [stringBytes length], digest)) { 
    /* SHA-1 hash has been calculated and stored in 'digest'. */ 
    ... 
} 

Đối với một tập hợp các số, chúng ta hãy giả sử bạn có nghĩa là một mảng của ints của biết chiều dài. Đối với dữ liệu như vậy, việc xây dựng thông tin tiêu hóa dễ dàng hơn để lặp đi lặp lại thay vì sử dụng chức năng một lần:

unsigned char digest[CC_SHA1_DIGEST_LENGTH]; 
uint32_t *someIntegers = ...; 
size_t numIntegers = ...; 

CC_SHA1_CTX ctx; 
CC_SHA1_Init(&ctx); 
{ 
    for (size_t i = 0; i < numIntegers; i++) 
     CC_SHA1_Update(&ctx, someIntegers + i, sizeof(uint32_t)); 
} 
CC_SHA1_Final(digest, &ctx); 

/* SHA-1 hash has been calculated and stored in 'digest'. */ 
... 

Lưu ý rằng điều này không tính đến độ tuổi. SHA-1 được tính toán với mã này trên hệ thống PowerPC sẽ khác với hệ thống được tính toán trên hệ thống i386 hoặc ARM. Giải pháp là đơn giản - trao đổi các byte của các số nguyên cho một endianness biết trước khi thực hiện việc tính toán:

for (size_t i = 0; i < numIntegers; i++) { 
     uint32_t swapped = CFSwapInt32HostToLittle(someIntegers[i]); /* or HostToBig */ 
     CC_SHA1_Update(&ctx, &swapped, sizeof(swapped)); 
    } 
+0

Crypto thông thường không tách rời SDK nữa – Daniel

+1

Kể từ 4.0.2, đúng vậy. Đi trước và thử nó! –

+1

Tất nhiên, đây là một điều cụ thể của iOS. Nó không đi kèm với ngôn ngữ Objective-C. –

2

SHA1 không thực sự đi kèm với Mục tiêu-C. Bạn có thể sử dụng mã nguồn C cho hashdeep và bạn bè, được cấp phép theo miền công cộng (Vì nó được viết bởi một nhân viên của chính phủ Hoa Kỳ): http://md5deep.sourceforge.net/.

+0

Một tùy chọn khác sẽ là libgcrypt, từ các nhà sản xuất của GnuPG (http://www.gnupg.org/related_software/libraries.en.html#lib-libgcrypt). – schot

+0

Có mã hóa bảo mật nào được hỗ trợ trực tiếp cho obj c và php không? – Daniel

+1

@schot: Nhưng libcrypt có giấy phép hạn chế hơn nhiều. @ Daniel: Không ra khỏi hộp, không. Mục tiêu-C không đi kèm với nhiều thư viện. –

4

Một giải pháp với một thư viện tiêu hóa tin nhắn (nv-ios-tiêu hóa):

(1) string

// Create an SHA1 instance, update it with a string and do final. 
SHA1 sha1 = [SHA1 sha1WithString:@"Hello"]; 

// Get the pointer of the internal buffer that holds the message digest value. 
// The life of the internal buffer ends when the SHA1 instance is discarded. 
// Copy the buffer as necessary. The size of the buffer can be obtained by 
// 'bufferSize' method. 
unsigned char *digestAsBytes = [sha1 buffer]; 

// Get the string expression of the message digest value. 
NSString *digestAsString = [sha1 description]; 

(2) số

// Create an SHA1 instance. 
SHA1 sha1 = [[SHA1 alloc] init]; 

// Update the SHA1 instance with numbers. 
// (Sorry, the current implementation is endianness-dependent.) 
[sha1 updateWithShort:(short)1]; 
[sha1 updateWithInt:(int)2]; 
[sha1 updateWithLong:(long)3]; 
[sha1 updateWithLongLong:(long long)4]; 
[sha1 updateWithFloat:(float)5]; 
[sha1 updateWithDouble:(double)6]; 

// Do final. 'final' method returns the pointer of the internal buffer 
// that holds the message digest value. 'buffer' method returns the same. 
// The life of the internal buffer ends when the SHA1 instance is discarded. 
// Copy the buffer as necessary. The size of the buffer can be obtained by 
// 'bufferSize' method. 
unsigned char *digestAsBytes = [sha1 final]; 

// Get the string expression of the message digest value. 
NSString *digestAsString = [sha1 description]; 

Thư viện thông báo thư hỗ trợ MD5, SHA-1, SHA-224, SHA-256, SHA-384 và SHA-512.

[Blog] nhắn tiêu hóa (MD5, SHA1, vv) trên iOS với các lớp học dành riêng
http://darutk-oboegaki.blogspot.jp/2013/04/message-digests-md5-sha1-etc-on-ios.html

[Thư viện] nv-ios-tiêu hóa
https://github.com/TakahikoKawasaki/nv-ios-digest