在IOS開發過程中,為了保證數據的安全,我們通常要采取一些加密方法,常見的加密有Base64加密和MD5加密。Base64加密是可逆的,MD5加密目前來說一般是不可逆的。我們在開發一款App過程中,對於發的請求,其中有個“sign”的字段,這個key對應的value是MD5加密的字段,旁邊的安卓同事問php後台,說MD5加密是32位的還是16位的,由於以前未曾注意過,所以就搜索了下,現在稍微總結下:
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個二進制數字。 以上就是我對MD5關於16位和32位的一些簡單理解,呵呵。