Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating SHA1 Hash from NSString

How can I create a SHA1 from a NSString.

Let's say the NSString is set up as:

NSString *message = @"Message";

I can use PHP to create a SHA1 hash with sha($message). But unfortunately it doesn't work like that within Objective-C.

like image 604
Alex van Rijs Avatar asked Sep 27 '11 13:09

Alex van Rijs


3 Answers

I have this in a category on NSString (available at https://github.com/hypercrypt/NSString-Hashes):

#import <CommonCrypto/CommonDigest.h>  ...  - (NSString *)sha1 {     NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];     uint8_t digest[CC_SHA1_DIGEST_LENGTH];      CC_SHA1(data.bytes, (CC_LONG)data.length, digest);      NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];      for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)     {         [output appendFormat:@"%02x", digest[i]];     }      return output; } 

Starting with Xcode 10.0, you should use import CommonCrypto instead since it is now natively available in Swift! If you have recently migrated to Xcode 10.0 and use the old approach, this can be your cue to make the change:

Command CompileSwift failed with a nonzero exit code

like image 175
hypercrypt Avatar answered Sep 23 '22 22:09

hypercrypt


I quite like hypercrypt's answer, but I've been encouraged to post my comment.

You could look at CC_SHA1, or this related SO question.

like image 36
Alex Avatar answered Sep 22 '22 22:09

Alex


- (NSString *)sha1:(NSString *)str {
const char *cStr = [str UTF8String];
unsigned char result[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(cStr, strlen(cStr), result);
NSString *s = [NSString  stringWithFormat:
           @"%02x%02x%02x%02x%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],
           result[16], result[17], result[18], result[19]
           ];

return s;
}
like image 27
virata Avatar answered Sep 23 '22 22:09

virata