标签:
#import <Foundation/Foundation.h> @interface NSString (Hash) @property (readonly) NSString *md5String; @property (readonly) NSString *sha1String; @property (readonly) NSString *sha256String; @property (readonly) NSString *sha512String; - (NSString *)hmacSHA1StringWithKey:(NSString *)key; - (NSString *)hmacSHA256StringWithKey:(NSString *)key; - (NSString *)hmacSHA512StringWithKey:(NSString *)key; - (NSString *)escapedURLString; @end
#import "NSString+hash.h" #import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonHMAC.h> @implementation NSString (Hash) - (NSString *)md5String { const char *string = self.UTF8String; int length = (int)strlen(string); unsigned char bytes[CC_MD5_DIGEST_LENGTH]; CC_MD5(string, length, bytes); return [self stringFromBytes:bytes length:CC_MD5_DIGEST_LENGTH]; } - (NSString *)sha1String { const char *string = self.UTF8String; int length = (int)strlen(string); unsigned char bytes[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(string, length, bytes); return [self stringFromBytes:bytes length:CC_SHA1_DIGEST_LENGTH]; } - (NSString *)sha256String { const char *string = self.UTF8String; int length = (int)strlen(string); unsigned char bytes[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(string, length, bytes); return [self stringFromBytes:bytes length:CC_SHA256_DIGEST_LENGTH]; } - (NSString *)sha512String { const char *string = self.UTF8String; int length = (int)strlen(string); unsigned char bytes[CC_SHA512_DIGEST_LENGTH]; CC_SHA512(string, length, bytes); return [self stringFromBytes:bytes length:CC_SHA512_DIGEST_LENGTH]; } - (NSString *)hmacSHA1StringWithKey:(NSString *)key { NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; NSData *messageData = [self dataUsingEncoding:NSUTF8StringEncoding]; NSMutableData *mutableData = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA1, keyData.bytes, keyData.length, messageData.bytes, messageData.length, mutableData.mutableBytes); return [self stringFromBytes:(unsigned char *)mutableData.bytes length:(int)mutableData.length]; } - (NSString *)hmacSHA256StringWithKey:(NSString *)key { NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; NSData *messageData = [self dataUsingEncoding:NSUTF8StringEncoding]; NSMutableData *mutableData = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA256, keyData.bytes, keyData.length, messageData.bytes, messageData.length, mutableData.mutableBytes); return [self stringFromBytes:(unsigned char *)mutableData.bytes length:(int)mutableData.length]; } - (NSString *)hmacSHA512StringWithKey:(NSString *)key { NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; NSData *messageData = [self dataUsingEncoding:NSUTF8StringEncoding]; NSMutableData *mutableData = [NSMutableData dataWithLength:CC_SHA512_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA512, keyData.bytes, keyData.length, messageData.bytes, messageData.length, mutableData.mutableBytes); return [self stringFromBytes:(unsigned char *)mutableData.bytes length:(int)mutableData.length]; } #pragma mark - Helpers - (NSString *)stringFromBytes:(unsigned char *)bytes length:(int)length { NSMutableString *mutableString = @"".mutableCopy; for (int i = 0; i < length; i++) [mutableString appendFormat:@"%02x", bytes[i]]; return [NSString stringWithString:mutableString]; } - (NSString *)escapedURLString { NSString *ret = self; char *src = (char *)[self UTF8String]; if (NULL != src) { NSMutableString *tmp = [NSMutableString string]; int ind = 0; while (ind < strlen(src)) // NOTE: if src is NULL, strlen() will crash. { if (isalpha(src[ind]) || isnumber(src[ind])) { [tmp appendFormat:@"%c", src[ind++]]; } else { [tmp appendFormat:@"%%%X", (unsigned char)src[ind++]]; } } ret = tmp; } return ret; } @end
Object-C MD5 And SHA And HMAC-SHA
标签:
原文地址:http://www.cnblogs.com/c-y-q/p/5168310.html