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
    
  • 相关阅读:
    T450的Fn lock
    移民,不应该是走投无路后的选择
    门槛低的行业看天赋,门槛高的行业看毅力
    个人是时代的一朵浪花
    转载:XPath基本语法
    爪哇国新游记之三十四----Dom4j的XPath操作
    常去的论坛今天两个传统行业的坛友要下岗了
    异常中要了解的Throwable类中的几个方法
    感觉JVM的默认异常处理不够好,既然不好那我们就自己来处理异常呗!那么如何自己处理异常呢?
    JVM对异常的默认处理方案
  • 原文地址:https://www.cnblogs.com/c-y-q/p/5168310.html
Copyright © 2011-2022 走看看