Sha256 in Objective-C for iPhone

By | January 12, 2018

When I use this code to create a sha256 of a string

unsigned char hashedChars[32];
NSString *inputString;
inputString = [NSString stringWithFormat:@"hello"];
NSData * inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
CC_SHA256(inputData.bytes, inputData.length, hashedChars);

It returns the hash correctly, but I need to insert a string like this \x00\x25\x53 and in this case, the function returns a sha256 of empty string because the specified encoding cannot be used to convert the receiver.

Now, my question is:How to insert this special characters for generate a correct hash? Thanks


Try this, it worked for me

1) To get a hash for plain text input

    const char* str = [input UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(str, strlen(str), result);

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
        [ret appendFormat:@"%02x",result[i]];
    return ret;

2) To get hash for NSData as input

Note:- I have used NSData category, so the code is as follow

- (NSString *)SHA256_HASH {
//if (!self) return nil;

unsigned char hash[CC_SHA256_DIGEST_LENGTH];
if ( CC_SHA256([(NSData*)self bytes], [(NSData*)self length], hash) ) {
    NSData *sha2 = [NSData dataWithBytes:hash length:CC_SHA256_DIGEST_LENGTH]; 

    // description converts to hex but puts <> around it and spaces every 4 bytes
    NSString *hash = [sha2 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 = %@",hash);

    // Format SHA256 fingerprint like
    // 00:00:00:00:00:00:00:00:00
    int keyLength=[hash length];
    NSString *formattedKey = @"";
    for (int i=0; i<keyLength; i+=2) {
        NSString *substr=[hash substringWithRange:NSMakeRange(i, 2)];
        if (i!=keyLength-2) 
            substr=[substr stringByAppendingString:@":"];
        formattedKey = [formattedKey stringByAppendingString:substr];

    return formattedKey;
return nil;



It’s important to know that you need to import:

#import <CommonCrypto/CommonDigest.h>

Hope this help!


You probably should use NSData instead of NSString then. Where do you get that string from?


Some one looking the solution in Swift 3.0. here is

extension String {

// MARK: - SHA256
func get_sha256_String() -> String {
    guard let data = .utf8) else {
        print("Data not available")
        return ""
    return getHexString(fromData: digest(input: data as NSData))

private func digest(input : NSData) -> NSData {
    let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
    var hashValue = [UInt8](repeating: 0, count: digestLength)
    CC_SHA256(input.bytes, UInt32(input.length), &hashValue)
    return NSData(bytes: hashValue, length: digestLength)

private  func getHexString(fromData data: NSData) -> String {
    var bytes = [UInt8](repeating: 0, count: data.length)
    data.getBytes(&bytes, length: data.length)

    var hexString = ""
    for byte in bytes {
        hexString += String(format:"%02x", UInt8(byte))
    return hexString

How to Use it

let signatures = "yourStringToBeConverted".get_sha256_String()

also don’t forgot to import #import <CommonCrypto/CommonHMAC.h> in your Bridging-Header.h

Leave a Reply

Your email address will not be published. Required fields are marked *