1. 程式人生 > >IOS成長之路-MD5加密演算法

IOS成長之路-MD5加密演算法

  1. -(NSString *)md5:(NSString *)str {  
  2.     constchar *cStr = [str UTF8String];//轉換成utf-8
  3.     unsigned char result[16];//開闢一個16位元組(128位:md5加密出來就是128位/bit)的空間(一個位元組=8字位=8個二進位制數)
  4.     CC_MD5( cStr, strlen(cStr), result);  
  5.     /* 
  6.         extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)官方封裝好的加密方法
     
  7.         把cStr字串轉換成了32位的16進位制數列(這個過程不可逆轉) 儲存到了result這個空間中 
  8.      */
  9.     return [NSString stringWithFormat:  
  10.             @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",  
  11.             result[0], result[1], result[2], result[3],  
  12.             result[4], result[5], result[6], result[7],  
  13.             result[8], result[9], result[10], result[11],  
  14.             result[12], result[13], result[14], result[15]  
  15.             ];  
  16.     /* 
  17.         x表示十六進位制,%02X  意思是不足兩位將用0補齊,如果多餘兩位則不影響 
  18.         NSLog("%02X", 0x888);  //888 
  19.         NSLog("%02X", 0x4); //04 
  20.      */
  21. }  

MD5加密演算法多數用於驗證,比如說密碼匹配用的就是MD5加密後得到的數值。

輸出方式用一個for迴圈來解決更為方便:

  1. NSMutableString *Mstr = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];  
  2.     for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {  
  3.         [Mstr appendFormat:@"%02X",result[i]];  
  4.     }  
  5.     return Mstr;  

注意:MD5演算法 不管是什麼語言得到的結果都是一樣的。

可能會有人遇到過ios客戶端和java伺服器端匹配MD5值會有不一樣的,我猜測:並不是演算法有問題,可能是某一方求MD5值少了一步,直接這樣搞定的:

  1. NSMutableString *Mstr = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];  
  2.     for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {  
  3.         [Mstr appendFormat:@"%d",(char)result[i]];  
  4.     }  
  5.     return Mstr;  

也就是說直接把result中的值取了出來,並沒有做 轉16進位制 處理。