ios中的加密算法之MD5

1.MD5是什么?
Message Digest Algorithm MD5(中文名為消息摘要算法第五版)是計算機安全領域廣泛使用的一種散列函數(shù)(也叫Hash函數(shù))蛮瞄,用以提供消息的完整性保護域慷。其核心思想是從給定的數(shù)據(jù)中提取特征碼念颈,不容產生重復搀军。加密后的字符串通常被稱為指紋或消息摘要症虑。

2.MD5算法特點
? 壓縮性:任意長度的數(shù)據(jù)缩歪,算出的MD5值長度都是固定的。相同的字符串谍憔,每次MD5后的結果是固定的匪蝙。都是32個字符
? 容易計算:從原數(shù)據(jù)計算出MD5值很容易。
? 抗修改性:對原數(shù)據(jù)進行任何改動韵卤,哪怕只修改1個字節(jié)骗污,所得到的MD5值都有很大區(qū)別。
? 弱抗碰撞:已知原數(shù)據(jù)和其MD5值沈条,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的需忿。
? 強抗碰撞:想找到兩個不同的數(shù)據(jù),使它們具有相同的MD5值蜡歹,是非常困難的屋厘。
不可逆性:不能逆運算。不可破解月而。

3汗洒、MD5的作用

3.1.一致性驗證

1.1.我們都知道,地球上任何人都有自己獨一無二的指紋,這常常成為司法機關鑒別罪犯身份最值得信賴的方法父款。與之類似溢谤,通過MD5就可以為任何文件(不管其大小、格式憨攒、數(shù)量)產生一個獨一無二的"數(shù)字指紋"世杀,如果任何人對文件做了任何改動,其MD5值也就是對應的"數(shù)字指紋"都會發(fā)生變化肝集。
1.2 .具體來說文件的MD5值就像是這個文件的“數(shù)字指紋”瞻坝。每個文件的MD5值是不同的,如果任何人對文件做了任何改動杏瞻,其MD5值也就是對應的“數(shù)字指紋”就會發(fā)生變化所刀。比如下載服務器針對一個文件預先提供一個MD5值,用戶下載完該文件后捞挥,用這個算法重新計算下載文件的MD5值浮创,通過比較這兩個值是否相同,就能判斷下載的文件是否出錯砌函,或者說下載的文件是否被篡改了蒸矛。
1.3.利用MD5算法來進行文件校驗的方案被大量應用到軟件下載站、論壇數(shù)據(jù)庫、系統(tǒng)文件安全等方面雏掠。

3.2.數(shù)字簽名

MD5的典型應用是對一段Message(字節(jié)串)產生fingerprint(指紋)以防止被“篡改”斩祭。

舉個例子:
你將一段話寫在一個叫readme.txt文件中,并對這個readme.txt產生一個MD5的值并記錄在案乡话,然后 你可以傳播這個文件給別人摧玫,別人如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發(fā)現(xiàn)(兩個MD5值不相同)绑青。如果再有一個第三方的認證機構诬像,用MD5還可以防止文件作者的“抵賴”,這就是所謂的數(shù)字簽名應用。

3.3.安全訪問認證
典型案例:加密用戶登錄密碼闸婴。
當用戶登錄的時候坏挠,系統(tǒng)把用戶輸入的密碼進行MD5 Hash運算,然后再去和保存在文件系統(tǒng)中的MD5值 進行比較邪乍,進而確定輸入的密碼是否正確降狠。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性庇楞。這可以避免用戶的密碼被具有系統(tǒng)管理員權限的用戶知道榜配。

4、MD5加密實現(xiàn)

代碼實現(xiàn)

NSString *password = self.passField.text.md5String; // 執(zhí)行一次MD5

NSString *password = self.passField.text.md5String.md5String; // 執(zhí)行兩次 MD5

對密碼進行
MD5 加密 - 不安全

如何使MD5加密更安全?

加鹽吕晌、現(xiàn)在用的比較少蛋褥,前兩年用得比較多。

//
準備鹽

static NSString *salt =@"fadsfdbvcxweioa43$$$$#@23123124{}{4";

NSString* password = [self.passField.text
stringByAppendingString:salt].md5String;

溫馨提示:‘鹽’在現(xiàn)實生活中是佐料,就是給密碼加點料睛驳,salt要夠咸(復雜點的字符串)烙心。

用HMac:HMAC運算利用哈希算法,以一個密鑰和一個消息為輸入乏沸,生成一個消息摘要作為輸出淫茵。

NSString* password = [self.passField.text
hmacMD5StringWithKey:@"itheima"];

上面代碼 md5 的過程:使用密鑰itheima對密碼加密,加密后做md5屎蜓,得到32位字符串痘昌,再次使用 itheima 加密钥勋,再md5炬转。

HMAC現(xiàn)在使用的比較廣泛,安全級別更高,
破解難度高算灸。

但還是有風險:每次結果一致扼劈,有可能被暴力破解。
要想做到的安全級別更更高菲驴,現(xiàn)在密碼學要求:同樣的算法荐吵,同樣的密碼明文,每次的結果不一樣。

5先煎、生成帶時間戳的密碼

使用時間戳贼涩,目前使用非常廣泛

5.1使用客戶端時間生成帶時間戳的密碼

  • (NSString *)timePassword{

    //1.設置密鑰key
    NSString *key = @"itheima".md5String;

    //2.使用密鑰key對密碼進行HMac
    NSString *pwd = [self.passField.texthmacMD5StringWithKey:key];

    NSLog(@"key = %@",key);

    //3.獲得當前的系統(tǒng)時間
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

    //指定時區(qū),真機通常需要指定時區(qū)
    fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];

    //設置時間格式
    fmt.dateFormat = @"yyyy-MM-dd HH:mm";

    //格式化當前時間
    NSString *dateStr = [fmt stringFromDate:[NSDate date]];

//4.用密碼+ 時間 生成密碼

pwd =[pwd stringByAppendingString:dateStr];

//5.返回hmac 結果

return [pwd hmacMD5StringWithKey:key];

}
NSString *password = [self timePassword];

5.2使用服務器時間,生成帶時間戳的密碼

  • (NSString *)timePassword{

    //1.設置密鑰key
    NSString *key = @"itheima".md5String;

    //2.對密鑰key對密碼進行HMac
    NSString *pwd = [self.passField.text hmacMD5StringWithKey:key];

//3.獲得當前服務器的系統(tǒng)時間

NSURL*url = [NSURL URLWithString:@"http://localhost/hmackey.php"];

//使用同步獲取時間(注意:這里要使用同步,確定先獲得服務器的時間,后面的代碼才能執(zhí)行)

NSData *timeData = [NSData dataWithContentsOfURL:url];

//反序列化取出時間

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:timeData options:0 error:NULL];

NSString *dateStr = dict[@"key"];

//4.用密碼+ 時間 生成密碼

pwd =[pwd stringByAppendingString:dateStr];

//5.返回hmac 結果

return [pwd hmacMD5StringWithKey:key];

}

問題解答:

為什么要獲得服務器時間來對密碼進行hmac薯蝎?

有些人是走在時間的前面的遥倦,他手機上的時間設置會比真實的時間的快5分鐘。如果是這樣的占锯,就會導致客戶端獲得的系統(tǒng)時間和服務器獲得的系統(tǒng)時間相差幾分鐘袒哥。那就會導致
hmac 的結果不一致,無法登錄消略。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末堡称,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子艺演,更是在濱河造成了極大的恐慌却紧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞艇,死亡現(xiàn)場離奇詭異啄寡,居然都是意外死亡,警方通過查閱死者的電腦和手機哩照,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門挺物,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人飘弧,你說我怎么就攤上這事识藤。” “怎么了次伶?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵痴昧,是天一觀的道長。 經常有香客問我冠王,道長赶撰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任柱彻,我火速辦了婚禮豪娜,結果婚禮上,老公的妹妹穿的比我還像新娘哟楷。我一直安慰自己瘤载,他們只是感情好,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布卖擅。 她就那樣靜靜地躺著鸣奔,像睡著了一般墨技。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挎狸,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天扣汪,我揣著相機與錄音,去河邊找鬼锨匆。 笑死私痹,一個胖子當著我的面吹牛,可吹牛的內容都是我干的统刮。 我是一名探鬼主播紊遵,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侥蒙!你這毒婦竟也來了暗膜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤鞭衩,失蹤者是張志新(化名)和其女友劉穎学搜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體论衍,經...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瑞佩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坯台。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炬丸。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜒蕾,靈堂內的尸體忽然破棺而出稠炬,到底是詐尸還是另有隱情,我是刑警寧澤咪啡,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布首启,位于F島的核電站,受9級特大地震影響撤摸,放射性物質發(fā)生泄漏毅桃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一准夷、第九天 我趴在偏房一處隱蔽的房頂上張望钥飞。 院中可真熱鬧,春花似錦冕象、人聲如沸代承。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽论悴。三九已至,卻和暖如春墓律,著一層夾襖步出監(jiān)牢的瞬間膀估,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工耻讽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留察纯,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓针肥,卻偏偏與公主長得像饼记,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子慰枕,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內容