Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generating SHA256 in iphone/Objective C ...?

Tags:

iphone

sha256

How to create a SHA256 of a String in iphone/objective c...

Sha256 in Objective-C for iPhone

I have read this..but i am not able to understand this..

I want to create output similar to php funcation as follows:-

$hash = hash_hmac("sha256", implode(';', $hash_parameters), $api_key);

where hash parameters is the array of arguments...

Can you write this as a method which will take the input string...?

And what will be the output of method NSData or NSString..??

I have to create a request with this..??

So in the request object..

[theRequest setHTTPBody:requestBody];

what should be the type of requestBody??

like image 680
Kuldeep Singh Avatar asked Jan 17 '11 08:01

Kuldeep Singh


3 Answers

I'm not sure I fully understand your questions but if you're looking to create a hashed string you CAN pass in your parameters as arguments to a hash function.

-(void)generateHashedString {

    NSString *key = @"Some random string";
    //enter your objects you want to encode in the data object
    NSString *data = [NSString stringWithFormat:@"%@%@%@", @"sha256", hash_parameters, api_key];

    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];

    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
                                          length:sizeof(cHMAC)];

    NSString *hash = [HMAC base64Encoding];

}

This will give you an NSString of hash that you can use to make your requests. NSLog(@"%@",hash); To see what you generated!

Make sure you #import <CommonCrypto/CommonHMAC.h> too

like image 125
TALLBOY Avatar answered Nov 12 '22 00:11

TALLBOY


I didn't compare the following code to the PHP function output but it works for me:

+(NSString *)signWithKey:(NSString *)key usingData:(NSString *)data
{   
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];

    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

    return [[HMAC.description stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];
}

Let me know if it was helpful...

like image 26
der_michael Avatar answered Nov 11 '22 23:11

der_michael


I spend a hole day, trying to convert the generated hash (bytes) into readable data. I used the base64 encoded like the answer above and it didn´t work at all for me (b.t.w. you need and an external .h to be able to use the base64 encoding, which i had).

So what i did was this (which works perfectly without an external .h):

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

// Now convert to NSData structure to make it usable again
NSData *out = [NSData dataWithBytes:cHMAC length:CC_SHA256_DIGEST_LENGTH];

// description converts to hex but puts <> around it and spaces every 4 bytes
NSString *hash = [out description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
// hash is now a string with just the 40char hash value in it
NSLog(@"%@",hash);
like image 2
bruno Avatar answered Nov 11 '22 23:11

bruno