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 的結果不一致,無法登錄消略。