我如何在iOS中计算SHA-2(理想的SHA 256或SHA 512)散列?
安全服务API似乎不允许我直接计算散列。 有很多公共领域和宽松许可的版本可用,但我宁愿使用系统库实现,如果可能的话。
数据可以通过NSData或普通指针访问。
散列的encryption强度对我很重要。 SHA-256是最小可接受的散列大小。
这是我用于SHA1的:
+ (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; }
将CC_SHA1
replace为CC_SHA256
(或您需要的任何一个),以及CC_SHA1_DIGEST_LENGTH
为CC_SHA256_DIGEST_LENGTH
。
您需要#import <CommonCrypto/CommonDigest.h>
这里是一个基于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; }
(积分转到http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1 )
这是为我工作
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 }
下面我用来创build文档哈希值的链接,它非常简单,易于计算大文件的哈希值。
链接: 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 /评论页-1 /#评论- 18533
+ (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]; }