Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Objective C: SHA1

How do i sha1 a string or set of numbers in Objective c?

like image 979
Daniel Avatar asked Aug 12 '10 13:08

Daniel


2 Answers

CommonCrypto (an Apple framework) has functions for calculating SHA-1 hashes, including a one-step hash:

#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'. */     ... } 

For a set of numbers, let us assume you mean an array of ints of known length. For such data, it is easier to iteratively construct the digest rather than use the one-shot function:

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'. */ ... 

Note that this does not take endianness into account. The SHA-1 calculated with this code on a PowerPC system will differ from the one calculated on an i386 or ARM system. The solution is simple--swap the bytes of the integers to a known endianness before doing the calculation:

    for (size_t i = 0; i < numIntegers; i++) {         uint32_t swapped = CFSwapInt32HostToLittle(someIntegers[i]); /* or HostToBig */         CC_SHA1_Update(&ctx, &swapped, sizeof(swapped));     } 
like image 185
Jonathan Grynspan Avatar answered Oct 14 '22 07:10

Jonathan Grynspan


Another solution with a message digest library (nv-ios-digest):

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

// 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]; 

The message digest library supports MD5, SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512.

[Blog] Message digests (MD5, SHA1, etc.) on iOS with dedicated classes
http://darutk-oboegaki.blogspot.jp/2013/04/message-digests-md5-sha1-etc-on-ios.html

[Library] nv-ios-digest
https://github.com/TakahikoKawasaki/nv-ios-digest

like image 30
Takahiko Kawasaki Avatar answered Oct 14 '22 09:10

Takahiko Kawasaki