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
    
  • 相关阅读:
    java工程师要求
    系统架构设计师知识模块
    Mybatis使用训练
    项目—视频直播系统
    [数算]概率
    查看镜像文件
    Hadoop启动命令
    Hadoop启动命令
    HDFS设置配额管理
    HDFS设置配额管理
  • 原文地址:https://www.cnblogs.com/c-y-q/p/5168310.html
Copyright © 2011-2022 走看看