zoukankan      html  css  js  c++  java
  • Objective-C MD5 And SHA And HMAC-SHA

    #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
    
  • 相关阅读:
    Nginx rewrite模块深入浅出详解
    一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
    nginx: [emerg] getpwnam(“www”) failed错误
    mysql5.7 启动报发生系统错误2
    obv15 实例6:如果K线柱过多,ZIG将发生变动,导致明显的OBV15指标被隐藏!
    obv15 案例4,待日后分析
    稳定
    教你识别指标骗局:以某家捕捞季节和主力追踪为例讲解
    C++ 语句
    C++ 表达式
  • 原文地址:https://www.cnblogs.com/c-y-q/p/5168310.html
Copyright © 2011-2022 走看看