iOS實現MD5加密的代碼
軟件開發過程中,對數據進行加密是保證數據安全的重要手段,常見的加密有Base64加密和MD5加密。Base64加密是可逆的,MD5加密目前來說一般是不可逆的。我們在開發一款iOS App過程中,對于發送的請求,其中有個“sign”的字段,這個key對應的value是MD5加密的字段。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現。MD5的作用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節串變換成一定長的十六進制數字串)。
注意生成“一定長”,這個“一定長”到底是多長呢!看了好多資料,包括維基百科和一些論壇,說MD5其實進過算法產生的是固定的128bit,即128個0和1的二進制位,而在實際應用開發中,通常是以16進制輸出的,所以正好就是32位的16進制,說白了也就是32個16進制的數字。
iOS MD5加密的方法如下:
#import <CommonCrypto/CommonDigest.h>
- (NSString *)md5:(NSString *)str
{
const char *cStr = [str UTF8String];
unsigned char result[16];
CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
其中%02x是格式控制符:‘x’表示以16進制輸出,‘02’表示不足兩位,前面補0;如‘f’輸出為0f,‘1f3’則輸出1f3;本來一般的都會介紹到這里就完了,我想多介紹一下代碼中result是個字符數組,那為什么是[16]呢,這是因為MD5算法最后生成的是128位,而在計算機的最小存儲單位為字節,1個字節是8位,對應一個char類型,計算可得需要16個char。所以result是[16]。那么為什么輸出的格式一定是%02x呢,而不是其它呢。這也是有原因的:因為約定MD5一般是以16進制的格式輸出,那么其實這個問題就轉換為把128個0和1以16進制來表示,每4位二進制對應一個16進制的元素,則需要32個16進制的元素,如果元素全部為0,放到char的數組中,正常是不會輸出,如00001111,以%x輸出,則是f,那么就會丟失0;但如果以%02x表示則輸出結果是0f,正好是轉換的正確結果。
所以以上就是char[16]和%02x的來歷。
至于人們說的16位MD5加密,其實是這樣的:舉例如果產生的MD5加密字符串是:01234567abcdefababcdefab76543210,則16位的MD加密字符是abcdefababcdefab,也就是只是截取了中間的16位。實際上這個操作已經不是MD5加密算法所包括的,而應當是對MD5加密算法結果的二次處理。其它的64位和大小寫什么的,都屬于對MD5算法結果的二次處理。因為MD5算法產生的結果就是128bit,128個二進制數字。