How can I compute a SHA-2 (ideally SHA 256 or SHA 512) hash in iOS?

后端 未结 6 1918
臣服心动
臣服心动 2020-11-27 10:32

The Security services API doesn\'t appear to allow me to compute a hash directly. There are plenty of public domain and liberally licensed versions available, but I\'d rathe

相关标签:
6条回答
  • 2020-11-27 11:06
    + (NSData *)sha256DataFromData:(NSData *)data {
        unsigned char result[CC_SHA256_DIGEST_LENGTH];
        CC_SHA256([data bytes], (int)[data length], result);
        return [NSData dataWithBytes:result length:CC_SHA256_DIGEST_LENGTH];
    }
    
    0 讨论(0)
  • 2020-11-27 11:11

    I cleaned up https://stackoverflow.com/a/13199111/1254812 a bit and structured it as an NSString extension

    @interface NSString (SHA2HEX)
    
    /*
     Get the SHA2 (256 bit) digest as a hex string.
     */
    @property (nonatomic, readonly) NSString* sha2hex;
    @end
    
    @implementation NSString (SHA2HEX)
    
    - (NSString*)sha2hex
    {
        NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
    
        if (data.length > UINT32_MAX)
            return nil;
    
        uint8_t digest[CC_SHA256_DIGEST_LENGTH];
        CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
    
        const int hexlen = CC_SHA256_DIGEST_LENGTH * 2;
        NSMutableString *hexstr = [NSMutableString stringWithCapacity:hexlen];
    
        for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
            [hexstr appendFormat:@"%02x", digest[i]];
        }
    
        return hexstr;
    }
    
    @end
    
    0 讨论(0)
  • 2020-11-27 11:14

    Below link i used for creating document hash value and Its very simple and easy to calculate hash value specially for large files.

    Link : http://www.joel.lopes-da-silva.com/2010/09/07/compute-md5-or-sha-hash-of-large-file-efficiently-on-ios-and-mac-os-x/comment-page-1/#comment-18533

    0 讨论(0)
  • 2020-11-27 11:18

    This is what worked for me

    func sha256(securityString : String) -> String {
        let data = securityString.dataUsingEncoding(NSUTF8StringEncoding)!
        var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
        CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
        let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))
        for byte in hash {
            output.appendFormat("%02x", byte)
        }
        return output as String
    }
    
    0 讨论(0)
  • 2020-11-27 11:19

    Here's a pretty similar one based on NSString

    + (NSString *)hashed_string:(NSString *)input
    {
        const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
        NSData *data = [NSData dataWithBytes:cstr length:input.length];
        uint8_t digest[CC_SHA256_DIGEST_LENGTH];
    
        // This is an iOS5-specific method.
        // It takes in the data, how much data, and then output format, which in this case is an int array.
        CC_SHA256(data.bytes, data.length, digest);
    
        NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
    
        // Parse through the CC_SHA256 results (stored inside of digest[]).
        for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
            [output appendFormat:@"%02x", digest[i]];
        }
    
        return output;
    }
    

    (Credits go to http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1)

    0 讨论(0)
  • 2020-11-27 11:29

    This is what I'm using for SHA1:

    #import <CommonCrypto/CommonDigest.h>
    
    + (NSData *)sha1:(NSData *)data {
        unsigned char hash[CC_SHA1_DIGEST_LENGTH];
        if ( CC_SHA1([data bytes], [data length], hash) ) {
            NSData *sha1 = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];        
            return sha1;
        }
    return nil;
    }
    

    Replace CC_SHA1 with CC_SHA256 (or whichever you need), as well as CC_SHA1_DIGEST_LENGTH with CC_SHA256_DIGEST_LENGTH.

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