参考链接 http://www.lidaren.com/archives/1466
之前在实现的SHA1的安全性已经满足不了用户需求,今天把SHA224/SHA256/SHA384/SHA512的实现一并附上。
SHA即Secure Hash Algorithm(安全散列算法)有多种不同位数的实现,常见的有SHA224/SHA256/SHA384/SHA512等
SHA224:
-(NSString*)sha224{constchar*cstr=[self cStringUsingEncoding:NSUTF8StringEncoding];NSData*data=[NSDatadataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA224_DIGEST_LENGTH]; CC_SHA224(data.bytes, data.length, digest);NSMutableString*output=[NSMutableStringstringWithCapacity:CC_SHA224_DIGEST_LENGTH*2];for(inti=0; i < CC_SHA224_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];returnoutput;}
SHA256:
-(NSString*)sha256{constchar*cstr=[self cStringUsingEncoding:NSUTF8StringEncoding];NSData*data=[NSDatadataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(data.bytes, data.length, digest);NSMutableString*output=[NSMutableStringstringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];for(inti=0; i < CC_SHA256_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];returnoutput;}
-(NSString*)sha384{constchar*cstr=[self cStringUsingEncoding:NSUTF8StringEncoding];NSData*data=[NSDatadataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA384_DIGEST_LENGTH]; CC_SHA384(data.bytes, data.length, digest);NSMutableString*output=[NSMutableStringstringWithCapacity:CC_SHA384_DIGEST_LENGTH*2];for(inti=0; i < CC_SHA384_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];returnoutput;}
-(NSString*)sha512{constchar*cstr=[self cStringUsingEncoding:NSUTF8StringEncoding];NSData*data=[NSDatadataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA512_DIGEST_LENGTH]; CC_SHA512(data.bytes, data.length, digest);NSMutableString*output=[NSMutableStringstringWithCapacity:CC_SHA512_DIGEST_LENGTH*2];for(inti=0; i < CC_SHA512_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];returnoutput;}
总结
网上整理 格式有点乱
////NSString+SHA.h//#import #import #import @interfaceNSString(SHA)-(NSString*)sha1;-(NSString*)sha224;-(NSString*)sha256;-(NSString*)sha384;-(NSString*)sha512;@end////NSString+SHA.m//#import "NSString+SHA.h"@implementationNSString(SHA)-(NSString*)sha1{constchar*cstr=[self cStringUsingEncoding:NSUTF8StringEncoding];NSData*data=[NSDatadataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(data.bytes, data.length, digest);NSMutableString*output=[NSMutableStringstringWithCapacity:CC_SHA1_DIGEST_LENGTH*2];for(inti=0; i < CC_SHA1_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];returnoutput;}-(NSString*)sha224{constchar*cstr=[self cStringUsingEncoding:NSUTF8StringEncoding];NSData*data=[NSDatadataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA224_DIGEST_LENGTH]; CC_SHA224(data.bytes, data.length, digest);NSMutableString*output=[NSMutableStringstringWithCapacity:CC_SHA224_DIGEST_LENGTH*2];for(inti=0; i < CC_SHA224_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];returnoutput;}-(NSString*)sha256{constchar*cstr=[self cStringUsingEncoding:NSUTF8StringEncoding];NSData*data=[NSDatadataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(data.bytes, data.length, digest);NSMutableString*output=[NSMutableStringstringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];for(inti=0; i < CC_SHA256_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];returnoutput;}-(NSString*)sha384{constchar*cstr=[self cStringUsingEncoding:NSUTF8StringEncoding];NSData*data=[NSDatadataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA384_DIGEST_LENGTH]; CC_SHA384(data.bytes, data.length, digest);NSMutableString*output=[NSMutableStringstringWithCapacity:CC_SHA384_DIGEST_LENGTH*2];for(inti=0; i < CC_SHA384_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];returnoutput;}-(NSString*)sha512{constchar*cstr=[self cStringUsingEncoding:NSUTF8StringEncoding];NSData*data=[NSDatadataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA512_DIGEST_LENGTH]; CC_SHA512(data.bytes, data.length, digest);NSMutableString*output=[NSMutableStringstringWithCapacity:CC_SHA512_DIGEST_LENGTH*2];for(inti=0; i < CC_SHA512_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];returnoutput;}