项目中开发中需要对一些数据进行加密后和服务器验证是否是我们客户端发出的请求!
方案是服务器定的,使用HmacSHA1加密和MD5 Base64加密
加密过程比较复杂
1.获取格林威治时间
2.用base64编码对请求数据内容进行MD5值计算
3.设置请求格式
4.设置鉴权信息,需要对上面的3个内容以及请求的链接 进行HMacSHA1再次进行加密
加密过后把上面4步获得的值加入到http的请求头中,一并发送给服务器,服务器经过验证后,才返回给我们我们想要的信息
下面贴代码说明我们使用的两个加密
首先是Base 64 MD5加密
1 //BASE 64 MD5加密 2 3 + (NSString *)getMd5_32Bit_String:(NSString *)srcString{ 4 const char *cStr = [srcString UTF8String]; 5 unsigned char result[16]; 6 CC_MD5( cStr, strlen(cStr), result ); 7 NSData *data = [NSData dataWithBytes:result length:CC_MD5_DIGEST_LENGTH]; 8 data = [GTMBase64 encodeData:data]; 9 NSString * base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 10 return base64String; 11 }
其次是HmacSHA1加密
1 //HmacSHA1加密 2 +(NSString *)Base_HmacSha1:(NSString *)key data:(NSString *)data{ 3 const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; 4 const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding]; 5 //Sha256: 6 // unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; 7 //CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); 8 9 //sha1 10 unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH]; 11 CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC); 12 13 NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC 14 length:sizeof(cHMAC)]; 15 16 //将加密结果进行一次BASE64编码。 17 NSString *hash = [HMAC base64EncodedStringWithOptions:0]; 18 return hash; 19 }
Base64 需要用到一个库:GTMBase64
HmacSHA1加密需要用到的库是:CommonCryptor