一蹦锋、消息摘要算法MD5、SHA-1

目錄

一欧芽、MD5
?1莉掂、MD5是什么
?2、MD5的特點
?3千扔、MD5的問題
?4憎妙、MD5的應用場景
?5、MD5的代碼
二曲楚、SHA-1
?1厘唾、SHA-1是什么
?2、SHA-1的代碼


一龙誊、MD5


1抚垃、MD5是什么

MD5(Message Digest Algorithm 5),消息摘要算法第五版趟大。

消息摘要算法又稱為哈希算法鹤树、散列算法,輸出的消息摘要又稱為哈希值逊朽、散列值罕伯。

2、MD5的特點

  • 壓縮性:MD5可以將任意長度的輸入轉化為128位長度的輸出叽讳;
  • 不可逆性:MD5是不可逆的追他,我們無法通過常規(guī)方式從MD5值倒推出它的原文坟募;
  • 抗修改性:對原文做一丁點兒改動,MD5值就會有巨大的變動邑狸,也就是說就算兩個MD5值非常相似懈糯,你也不能想當然地認為它們倆對應的原文也非常相似。

3推溃、MD5的問題

MD5解密網(wǎng)站

因為MD5是不可逆的昂利,所以MD5是安全的届腐。但是2004年铁坎,山東大學的王小云教授在美國加州舉辦的密碼學會議上宣布破解了MD5,其實并不是真正的破解犁苏,而是非常明顯地加快了反向查詢的速度硬萍,在當時計算機的計算能力下,利用她們的技術围详,可以在幾個小時內就找到一個MD5值對應的原文朴乖。因為MD5可以被暴力破解,所以MD5不再是安全的了助赞,對安全性要求較高的場合买羞,不建議直接使用MD5。

4雹食、MD5的應用場景

4.1 對密碼加密

MD5可以用來對密碼加密畜普,防止密碼被竊聽。

  • 為什么要對密碼加密

比如一個用戶的用戶名為18666666666群叶,密碼為123456吃挑,那么如果不對密碼加密,客戶端在注冊或登錄的時候街立,就是明文傳輸密碼http://localhost:8080/hw/register|login?username=18666666666&password=123456舶衬,傳輸過程中一旦請求被截獲,用戶的密碼就被泄漏了赎离;再者服務器的數(shù)據(jù)庫中也是明文存儲密碼

username password
18666666666 123456

一旦數(shù)據(jù)庫泄漏逛犹,用戶的密碼就被泄漏了。

而如果我們使用了MD5對密碼加密梁剔,客戶端在注冊或登錄的時候虽画,就是密文傳輸密碼http://localhost:8080/hw/register|login?username=18666666666&password=e10adc3949ba59abbe56e057f20f883e,傳輸過程中即便請求被截獲憾朴,用戶的密碼也不會被泄漏狸捕;再者服務器的數(shù)據(jù)庫中也是密文存儲密碼

username password
18666666666 e10adc3949ba59abbe56e057f20f883e

就算數(shù)據(jù)庫泄漏,用戶的密碼也不會被泄漏众雷。

  • 彩虹表灸拍、加鹽

攻擊者創(chuàng)建了一個叫彩虹表的東西做祝,它是一個非常龐大的數(shù)據(jù)庫,里面收集了所有常用的密碼鸡岗,以及這些密碼對應的MD5值混槐、SHA-1值等轩性,現(xiàn)在主流的彩虹表記錄數(shù)據(jù)約90萬億條,占用硬盤超過500TB揣苏。有了彩虹表,攻擊者就可以通過窮舉法反向查詢出MD5值卸察、SHA-1值等對應的原文脯厨,因此如果你的密碼很不幸被搜集在彩虹表里,就可能被破解掉坑质,這也是為什么很多場合我們輸密碼的時候,有字母數(shù)字下劃線大小寫等亂七八糟各種要求涡扼,目的就是盡量使得明文密碼的復雜度增加一些稼跳,盡量使得明文密碼及其MD5值吃沪、SHA-1值等不被收集在彩虹表里汤善。

可見直接使用MD5加密是不安全的,但是我們可以加鹽巷波。加鹽是指在密碼的任意位置插入一些指定的字符串(即鹽值salt)萎津,加鹽的目的也是為了盡量增強明文密碼的復雜度抹镊,盡量使得明文密碼及其MD5值锉屈、SHA-1值等不被收集在彩虹表里垮耳。

4.2 生成數(shù)字簽名

MD5可以用來生成數(shù)字簽名,驗證數(shù)據(jù)是否被篡改终佛。

5、MD5的代碼

//
//  EncryptUtil.h
//

#import <Foundation/Foundation.h>

@interface EncryptUtil : NSObject

/**
 * MD5加密铃彰,返回32位十六進制小寫密文
 *
 * @param plaintext 明文
 *
 * @return 密文
 */
+ (NSString *)md5LowercaseCiphertextFromString:(NSString *)plaintext;

/**
 * MD5加密,返回32位十六進制大寫密文
 *
 * @param plaintext 明文
 *
 * @return 密文
 */
+ (NSString *)md5UppercaseCiphertextFromString:(NSString *)plaintext;

@end
//
//  EncryptUtil.m
//

#import "EncryptUtil.h"
#import <CommonCrypto/CommonCrypto.h>

@implementation EncryptUtil

+ (NSString *)md5LowercaseCiphertextFromString:(NSString *)plaintext {
    
    // 加密數(shù)組(占16個字節(jié))
    unsigned char resultArray[CC_MD5_DIGEST_LENGTH];
    // 加密
    CC_MD5(plaintext.UTF8String, (CC_LONG)strlen(plaintext.UTF8String), resultArray);
    // 密文
    NSMutableString *md5Ciphertext = [NSMutableString string];
    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        
        [md5Ciphertext appendFormat:@"%02x", resultArray[i]]; // x代表十六進制
    }
    
    return md5Ciphertext;
}

+ (NSString *)md5UppercaseCiphertextFromString:(NSString *)plaintext {
    
    // 加密數(shù)組(占16個字節(jié))
    unsigned char resultArray[CC_MD5_DIGEST_LENGTH];
    // 加密
    CC_MD5(plaintext.UTF8String, (CC_LONG)strlen(plaintext.UTF8String), resultArray);
    // 密文
    NSMutableString *md5Ciphertext = [NSMutableString string];
    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        
        [md5Ciphertext appendFormat:@"%02X", resultArray[i]]; // X代表十六進制
    }
    
    return md5Ciphertext;
}

@end


二竹揍、SHA-1


1敬飒、SHA-1是什么

SHA(Secure Hash Algorithm)芬位,安全哈希算法,包括SHA-1昧碉、SHA-256、SHA-512等被饿。

SHA-1和MD5都是由MD4導出的,所以它們的特點锹漱、問題和應用場景基本一致。它們的區(qū)別就是SHA-1輸出的長度是160位哥牍,MD5的輸出是128位喝检,2的160次方是遠遠超過2的128次方這個數(shù)量級的,所以SHA-1相對來說要比MD5更安全一些挠说,但也可以被暴力破解。

2损俭、SHA-1的代碼

//
//  EncryptUtil.h
//

#import <Foundation/Foundation.h>

@interface EncryptUtil : NSObject

/**
 * SHA-1加密,返回40位十六進制小寫密文
 *
 * @param plaintext 明文
 *
 * @return 密文
 */
+ (NSString *)sha1LowercaseCiphertextFromString:(NSString *)plaintext;

/**
 * SHA-1加密杆兵,返回40位十六進制大寫密文
 *
 * @param plaintext 明文
 *
 * @return 密文
 */
+ (NSString *)sha1UppercaseCiphertextFromString:(NSString *)plaintext;

@end
//
//  EncryptUtil.m
//

#import "EncryptUtil.h"
#import <CommonCrypto/CommonCrypto.h>

@implementation EncryptUtil

+ (NSString *)sha1LowercaseCiphertextFromString:(NSString *)plaintext {
    
    const char *cstr = [plaintext cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:plaintext.length];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(data.bytes, (unsigned int)data.length, digest);
    
    NSMutableString *sha1Ciphertext = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
    for(NSInteger i = 0; i < CC_SHA1_DIGEST_LENGTH; i ++) {
        
        [sha1Ciphertext appendFormat:@"%02x", digest[I]]; // x代表十六進制
    }
    
    return sha1Ciphertext;
}

+ (NSString *)sha1UppercaseCiphertextFromString:(NSString *)plaintext {
    
    const char *cstr = [plaintext cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:plaintext.length];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(data.bytes, (unsigned int)data.length, digest);
    
    NSMutableString *sha1Ciphertext = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
    for(NSInteger i = 0; i < CC_SHA1_DIGEST_LENGTH; i ++) {
        
        [sha1Ciphertext appendFormat:@"%02X", digest[I]]; // X代表十六進制
    }
    
    return sha1Ciphertext;
}

@end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市琐脏,隨后出現(xiàn)的幾起案子崇呵,更是在濱河造成了極大的恐慌,老刑警劉巖钮蛛,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件受神,死亡現(xiàn)場離奇詭異格侯,居然都是意外死亡鼻听,警方通過查閱死者的電腦和手機樟结,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來精算,“玉大人,你說我怎么就攤上這事灰羽。” “怎么了廉嚼?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵怠噪,是天一觀的道長恐似。 經(jīng)常有香客問我傍念,道長矫夷,這世上最難降的妖魔是什么憋槐? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮阳仔,結果婚禮上,老公的妹妹穿的比我還像新娘近范。我一直安慰自己,他們只是感情好评矩,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稚照,像睡著了一般蹂空。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上上枕,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天弱恒,我揣著相機與錄音辨萍,去河邊找鬼。 笑死爪飘,一個胖子當著我的面吹牛,可吹牛的內容都是我干的师崎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼犁罩,長吁一口氣:“原來是場噩夢啊……” “哼两疚!你這毒婦竟也來了床估?” 一聲冷哼從身側響起诱渤,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎递胧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谓着,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡坛掠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年治筒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耸袜。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堤框,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蜈抓,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布委可,位于F島的核電站,受9級特大地震影響着倾,放射性物質發(fā)生泄漏拾酝。R本人自食惡果不足惜卡者,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崇决。 院中可真熱鬧,春花似錦嗽桩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽譬重。三九已至,卻和暖如春臀规,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塔嬉。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工租悄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谨究,地道東北人泣棋。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像潭辈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子把敢,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容

  • 本文主要介紹移動端的加解密算法的分類技竟、其優(yōu)缺點特性及應用冰肴,幫助讀者由淺入深地了解和選擇加解密算法。文中會包含算法的...
    蘋果粉閱讀 11,470評論 5 29
  • 在介紹加密算法之前, 先介紹一下 base64: 0. base64 Base64要求把每三個8Bit的字節(jié)轉換為...
    reboot_q閱讀 12,757評論 3 8
  • 參考聊一聊MD5MD5算法原理為什么說 MD5 是不可逆的联逻? 一、MD5是什么 message-digest al...
    合肥黑閱讀 2,270評論 0 6
  • 這篇文章主要講述在Mobile BI(移動商務智能)開發(fā)過程中包归,在網(wǎng)絡通信铅歼、數(shù)據(jù)存儲公壤、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 2,354評論 0 6
  • 很多人都說椎椰,我在外面性格特別好,朋友們都跟我相處很愉快慨飘,可是一回到家里,就很奇怪瓤的,為何面對父母,我完全不能自控的燃...
    黑子陳沿樺閱讀 178評論 2 0