項目中開發中需要對一些數據進行加密后和服務器驗證是否是我們客戶端發出的請求!
方案是服務器定的,使用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