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,

3
  • 3
    I certainly hope you aren't expecting any behavioral similarities between Javascript and Objective-C. Commented Feb 14, 2011 at 12:26
  • I've seen that thread already thanks. I'm trying to return the sha256 string. Commented Feb 14, 2011 at 12:28
  • 2
    The linked question is not an exact duplicate. Voted to reopen. Commented Apr 30, 2011 at 0:28

3 Answers 3

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.

Sign up to request clarification or add additional context in comments.

6 Comments

making your code depend on description seem like a very bad idea to me. Description is not meant to be machine readable but only for debugging.
how can i use this with a key , i mean let say i have string and key ,
What's CC_SHA256_DIGEST_LENGTH? Got it - need to #include <CommonCrypto/CommonDigest.h>
This is a bad answer as you should never rely on description to process information. Description provides information for debugging purposes only, classes override the default NSObject method (that prints the memory address of the object) to provide useful information for debugging. A change on what this method actually does can happen at any time without notice.
Swift 3 format?
|
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.

2 Comments

Hey, I did that, but I get gobbldy-gook on the result. It looks like UTF8, when in fact I want it base64 encoded...
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.
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].

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.