如果你们在加密的时候,后台告诉你,用哈希算法或者MD5算法,然后用加密key来加密,你可能会一脸懵逼,博主也是第一次听说哈希加密要用加密key,为了弥补下知识空缺,博主就在网上查找资料,结果找到了这个东西:消息摘要算法。
消息摘要算法
我们通常在遇到的时候会看到“HMAC”字眼,mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。
关于HMAC算法,需要和SHA256结合起来的话,代码如下:
//如果需要用到SHA的其他加密方法,比如128,1就把里面的256字眼换成对应的数字即可 引入头文件 #import <CommonCrypto/CommonHMAC.h> #import <CommonCrypto/CommonCryptor.h> - (NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key { const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding]; unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)]; const unsigned char *buffer = (const unsigned char *)[HMACData bytes]; NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2]; for (int i = 0; i < HMACData.length; ++i){ [HMAC appendFormat:@"%02x", buffer[i]]; } return HMAC; }
HMACMD5加密
//引入头文件 #import <CommonCrypto/CommonDigest.h> + (NSString *)HMACMD5WithString:(NSString *)toEncryptStr WithKey:(NSString *)keyStr { const char *cKey = [keyStr cStringUsingEncoding:NSUTF8StringEncoding]; const char *cData = [toEncryptStr cStringUsingEncoding:NSUTF8StringEncoding]; const unsigned int blockSize = 64; char ipad[blockSize]; char opad[blockSize]; char keypad[blockSize]; unsigned int keyLen = strlen(cKey); CC_MD5_CTX ctxt; if (keyLen > blockSize) { CC_MD5_Init(&ctxt); CC_MD5_Update(&ctxt, cKey, keyLen); CC_MD5_Final((unsigned char *)keypad, &ctxt); keyLen = CC_MD5_DIGEST_LENGTH; } else { memcpy(keypad, cKey, keyLen); } memset(ipad, 0x36, blockSize); memset(opad, 0x5c, blockSize); int i; for (i = 0; i < keyLen; i++) { ipad[i] ^= keypad[i]; opad[i] ^= keypad[i]; } CC_MD5_Init(&ctxt); CC_MD5_Update(&ctxt, ipad, blockSize); CC_MD5_Update(&ctxt, cData, strlen(cData)); unsigned char md5[CC_MD5_DIGEST_LENGTH]; CC_MD5_Final(md5, &ctxt); CC_MD5_Init(&ctxt); CC_MD5_Update(&ctxt, opad, blockSize); CC_MD5_Update(&ctxt, md5, CC_MD5_DIGEST_LENGTH); CC_MD5_Final(md5, &ctxt); const unsigned int hex_len = CC_MD5_DIGEST_LENGTH*2+2; char hex[hex_len]; for(i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { snprintf(&hex[i*2], hex_len-i*2, "%02x", md5[i]); } NSData *HMAC = [[NSData alloc] initWithBytes:hex length:strlen(hex)]; NSString *hash = [[NSString alloc] initWithData:HMAC encoding:NSUTF8StringEncoding]; return hash; }
参考博客:
http://supershll.blog.163.com/blog/static/37070436201411522220174/
http://www.jianshu.com/p/98e376b66a26
对于hmac的解析推荐百度词条,了解即可。