iOS實現MD5加密

軟件開發(fā)過程中,對數據進行加密是保證數據安全的重要手段,常見的加密有Base64加密和MD5加密。Base64加密是可逆的,MD5加密目前來說一般是不可逆的。我們在開發(fā)一款iOSApp過程中,對于發(fā)送的請求,其中有個“sign”的字段,這個key對應的value是MD5加密的字段。

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現。MD5的作用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節(jié)串變換成一定長的十六進制數字串)。

注意生成“一定長”,這個“一定長”到底是多長呢!看了好多資料,包括維基百科和一些論壇,說MD5其實進過算法產生的是固定的128bit,即128個0和1的二進制位,而在實際應用開發(fā)中,通常是以16進制輸出的,所以正好就是32位的16進制,說白了也就是32個16進制的數字。

iOS MD5加密的方法如下:

#import

- (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位,而在計算機的最小存儲單位為字節(jié),1個字節(jié)是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個二進制數字。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容