標籤:com 條件 逆轉 string 雜湊演算法 end 通過 服務 結構
一、MD5定義 MD5即Message-Digest Algorithm 5(訊息-摘要演算法5),為電腦安全領域廣泛使用的一種散列函數,用以提供訊息的完整性保護(又譯摘要演算法、雜湊演算法),主流程式設計語言普遍已有MD5實現。將資料運算為另一固定長度值,是雜湊演算法的基礎原理,MD5的前身有MD2、MD3和MD4。 也有說法MD5不是密碼編譯演算法, 因為如果目的是加密,必須滿足的一個條件是加密過後可以解密。但是MD5是無法從結果還原出未經處理資料的。 二、MD5特點 1、壓縮性:任意長度的資料,算出的MD5值長度都是固定的。 2、容易計算:從原資料計算出MD5值很容易。 3、抗修改性:對原資料進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。 4、弱抗碰撞:已知原資料和其MD5值,想找到一個具有相同MD5值的資料(即偽造資料)是非常困難的。 5、強抗碰撞:想找到兩個不同的資料,使它們具有相同的MD5值,是非常困難的。 6、MD5加密是不可解密的,但是網上有一些解析MD5的,那個相當於一個大型的資料庫,通過匹配MD5去找到原密碼。所以,只要在要加密的字串前面加上一些字母數字記號或者多次MD5加密,這樣出來的結果一般是解析不出來的。 三、MD5好處 1、壓縮到固定長度128bit,長度小適合互連網傳輸; 2、相同檔案多次壓縮的值不變,常用於對檔案的是否被篡改的校正; 3、不同檔案壓縮後出現值衝突的幾率很小; 4、md5演算法比同類的sha-1計算速度快; 四、MD5應用 1、一致性驗證:MD5的典型應用是對一段資訊(Message)產生資訊摘要(Message-Digest),以防止被篡改。MD5就可以為任何檔案(不管其大小、格式、數量)產生一個同樣獨一無二的“數位指紋”,如果任何人對檔案做了任何改動,其MD5值也就是對應的“數位指紋”都會發生變化。 2、數位簽章:MD5的典型應用是對一段Message(位元組串)產生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫 readme.txt檔案中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個檔案給別人,別人如果修改了檔案中的任何內容,你對這個檔案重新計算MD5時就會發現(兩個MD5值不相同)。如果再有一個第三方的認證機構,用MD5還可以防止檔案作者的“抵賴”,這就是所謂的數位簽章應用。 3、安全訪問認證:MD5還廣泛用於作業系統的登陸認證上,如Unix、各類BSD系統登入密碼、數位簽章等諸多方面。如在Unix系統中使用者的密碼是以MD5(或其它類似的演算法)經Hash運算後儲存在檔案系統中。當使用者登入的時候,系統把使用者輸入的密碼進行MD5 Hash運算,然後再去和儲存在檔案系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在並不知道使用者密碼的明碼的情況下就可以確定使用者登入系統的合法性。這可以避免使用者的密碼被具有系統管理員許可權的使用者知道。 移動端多用於 1、本機資料加密:對NSUserDefaults,qlite,隱藏檔資料加密,保護帳號和關鍵資訊。 2、URL編碼加密:對程式中出現的URL進行編碼加密,防止URL被靜態分析 3、網路傳輸資料加密:對用戶端傳輸資料提供加密方案,有效防止通過網路介面的攔截擷取 4、方法體,方法名進階混淆:對應用程式的方法名和方法體進行混淆,保證源碼被逆向後無法解析代碼 5、程式結構混排加密:對應用程式邏輯結構進行打亂混排,保證源碼可讀性降到最低 code:- (NSString*)md5String { const char *str = self.UTF8String; // 轉為utf-8 uint8_t buffer[CC_MD5_DIGEST_LENGTH]; //開闢一個16位元組(128位:md5加密出來就是128位/bit)的空間(一個位元組=8字位=8個位元) // 把str字串轉換成了32位的16進位數列(這個過程無法復原轉) 儲存到了result這個空間中 CC_MD5(str, (CC_LONG)strlen(str), buffer); NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { [output appendFormat:@"%02x", buffer[i]]; } return output;} 使用: NSString *pwd = @"123457"; NSString *md5Str = [pwd md5String]; NSLog(@"%@", md5Str); // f1887d3f9e6ee7a32fe5e76f4ab80d63 可能會有人遇到過ios用戶端和伺服器端匹配MD5值會有不一樣的,我猜測:並不是演算法有問題,可能是某一方求MD5值少做一步,或者大小寫位元沒有約定好。 對於需要加密的內容可以進行多次MD5加密或者加鹽,增加安全性。 參考:http://baike.baidu.com/link?url=FII-wKl06KB_vzlHR7DdIyyXXYvhHIMnmn_jsF9kAtEXBOFVAW3rBnBwsLESHpawoHDp7r8WLXDhlqBvdNK_Wa
MD5 訊息摘要演算法5