iOS的网络数据加密算法之HMAC浅谈
前言
现在的加密方式有很多,目前计算环境和过去有很大的变化,许多数据资源能够依靠网络来远程存取,而且越来越多的通讯依赖于公共网络公共网络(如 Internet),而这些环境并不保证实体间的安全通信,数据在传输过程可能被其它人读取或篡改。
加密将防止数据被查看或修改,并在原本不安全的信道上提供安全的通信信道,它达到以下目的:
· 保密性:防止用户的标识或数据被读取。
· 数据完整性:防止数据被更改。
· 身份验证:确保数据发自特定的一方。
HMAC运算步骤
First-Hash = H(Ko XOR Ipad || (data to auth)) Second-Hash = H(Ko XOR Opad || First-Hash)
(1) 在密钥K后面添加0来创建一个字长为B的字符串。(例如,如果K的字长是20
字节,B=64字节,则K后会加入44个零字节0x00)
(2) 将上一步生成的B字长的字符串与ipad做异或运算。
(3) 将数据流text填充至第二步的结果字符串中。
(4) 用H作用于第三步生成的数据流。
(5) 将第一步生成的B字长字符串与opad做异或运算。
(6) 再将第四步的结果填充进第五步的结果中。
(7) 用H作用于第六步生成的数据流,输出最终结果
废话不多说,上图~
此处用的是Hmac+SHA1
注意:需要包含着3个头文件
#include <CommonCrypto/CommonDigest.h> #include <CommonCrypto/CommonHMAC.h> #include "base64.h"
+ (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret { NSData *secretData = [secret dataUsingEncoding:NSUTF8StringEncoding]; NSData *clearTextData = [text dataUsingEncoding:NSUTF8StringEncoding]; unsigned char result[20]; CCHmac(kCCHmacAlgSHA1, [secretData bytes], [secretData length], [clearTextData bytes], [clearTextData length], result); char base64Result[32]; size_t theResultLength = 32; Base64EncodeData(result, 20, base64Result, &theResultLength,YES); NSData *theData = [NSData dataWithBytes:base64Result length:theResultLength]; NSString *base64EncodedResult = [[NSString alloc] initWithData:theData encoding:NSASCIIStringEncoding]; return base64EncodedResult; }
这个方法使用到了base64的一些方法,所以要包含base64文件:
//base64.h extern size_t EstimateBas64EncodedDataSize(size_t inDataSize); extern size_t EstimateBas64DecodedDataSize(size_t inDataSize); extern bool Base64EncodeData(const void *inInputData, size_t inInputDataSize, char *outOutputData, size_t *ioOutputDataSize, BOOL wrapped); extern bool Base64DecodeData(const void *inInputData, size_t inInputDataSize, void *ioOutputData, size_t *ioOutputDataSize);
安全性浅析
由上面的介绍,我们可以看出,HMAC算法更象是一种加密算法,它引入了密钥,其安全性已经不完全依赖于所使用的HASH算法,安全性主要有以下几点保证:
使用的密钥是双方事先约定的,第三方不可能知道。由3.2介绍的应用流程可以看出,作为非法截获信息的第三方,能够得到的信息只有作为"挑战"的随机数和作为"响应"的HMAC结果,无法根据这两个数据推算出密钥。由于不知道密钥,所以无法仿造出一致的响应,安全性是值得信赖的。
kCCHmacAlgSHA1
浙公网安备 33010602011771号