12

Possible Duplicate:
Sha256 in Objective-C for iPhone

Greetings,

I'm having terrible trouble generating a SHA256 string in Objective C (probably because I'm so new to the language).

In jQuery, all I have to do is this:

var sha256String=$.sha256("Hello");

which produces the hash as expected.

But in Objective-C, I've tried the following to no avail:

NSString *pword=[[NSString alloc]
initWithString:login_pword.text];
unsigned char result[64];
CC_SHA256([pword UTF8String], [pword lengthOfBytesUsingEncoding:NSASCIIStringEncoding],result);
UIAlertView *msg=[[UIAlertView alloc] initWithTitle:@"Hi" message:result delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[msg show];
[msg release];

Is there some function that I can call such as:

NSString *sha256String=[self getSHA256:pword];

This is what I'm trying to create and I'm finding it very difficult!

I hope someone can help.

Many thanks in advance,

Community
  • 1
  • 1
Eamorr
  • 9,636
  • 32
  • 120
  • 205

3 Answers3

56

After much playing around today, I finally came up with a function to get the SHA256:

-(NSString*) sha256:(NSString *)clear{
    const char *s=[clear cStringUsingEncoding:NSASCIIStringEncoding];
    NSData *keyData=[NSData dataWithBytes:s length:strlen(s)];

    uint8_t digest[CC_SHA256_DIGEST_LENGTH]={0};
    CC_SHA256(keyData.bytes, keyData.length, digest);
    NSData *out=[NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
    NSString *hash=[out description];
    hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
    return hash;
}

This gives the same output as PHP. It can easily be converted to SHA1 - just change 'SHA256' to 'SHA1'.

Hope it helps someone.

Eamorr
  • 9,636
  • 32
  • 120
  • 205
3

You are passing result into the UIAlertView's init method. result is a char[], and UIAlertView expects an NSString*. You need to convert your char[] to an NSString *.

Try this:

NSString *resultString = [NSString stringWithCString:result encoding:NSASCIIStringEncoding];
UIAlertView *msg=[[UIAlertView alloc] initWithTitle:@"Hi" message:resultString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

Also see this article on hashing on the iPhone.

Marc W
  • 18,919
  • 4
  • 58
  • 71
  • Hey, I did that, but I get gobbldy-gook on the result. It looks like UTF8, when in fact I want it base64 encoded... – Eamorr Feb 14 '11 at 12:35
  • Well you aren't Base64 encoding the result data anywhere in the code you posted. Have you tried doing that first? And again, read the article I posted the link to. It is for MD5 hashing but mentions adjustments you have to make for SHA256. – Marc W Feb 14 '11 at 12:38
1

You will need to use the OpenSSL C functions. See for example this question on how to do that. As input string, you'd use [myString UTFString] with length [myString lengthOfBytesUsingEncoding:NSUTF8StringEncoding].

Community
  • 1
  • 1
DarkDust
  • 87,789
  • 19
  • 183
  • 216