Sha256 in Objective-C for iPhone

前端 未结 4 1314
天命终不由人
天命终不由人 2020-12-08 05:36

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

unsigned char hashedChars[32];
NSString *inputString;
inputString = [NSString stringWithFormat:@\"hello\"         


        
相关标签:
4条回答
  • 2020-12-08 06:13

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

    0 讨论(0)
  • 2020-12-08 06:16

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

    #import <CommonCrypto/CommonDigest.h>
    

    Hope this help!

    0 讨论(0)
  • 2020-12-08 06:26

    Try this, it worked for me

    1) To get a hash for plain text input

    -(NSString*)sha256HashFor:(NSString*)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;
    }
    
    0 讨论(0)
  • 2020-12-08 06:31

    Some one looking the solution in Swift 3.0. here is

    extension String {
    
    // MARK: - SHA256
    func get_sha256_String() -> String {
        guard let data = self.data(using: .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

    0 讨论(0)
提交回复
热议问题