1. 程式人生 > >iOS 實現MD5加密的程式碼

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個二進位制數字。