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

posted on 2017-01-07 22:57  调学者  阅读(327)  评论(0)    收藏  举报

导航