今天簡單介紹一下md5加密,首先MD5加密有如下幾個特點(diǎn):
1、同樣的數(shù)據(jù)加密結(jié)果是一樣的.(32個字符)
2盗蟆、不可逆的.(不能逆向解密)
MD5算法是公開的,iOS中已經(jīng)包裝好了MD5算法舒裤。
可以將其寫成字符串的分類:
- (NSString*)md5String
{
? ? ? ? ? ?constcharchar*string?=self.UTF8String;
? ? ? ? ? ?intlength?=?(int)strlen(string);
? ? ? ? ? ?unsignedcharbytes[CC_MD5_DIGEST_LENGTH];
? ? ? ? ? ?CC_MD5(string,?length,?bytes);
? ? ? ? ? ?return[selfstringFromBytes:byteslength:CC_MD5_DIGEST_LENGTH];
}
- (NSString*)md5 {
? ? ?constchar*cStr = [selfUTF8String];
? ? ?unsignedcharresult[CC_MD5_DIGEST_LENGTH];
? ? ?CC_MD5(cStr, (CC_LONG)strlen(cStr), result);
? ? ? ? ? ? ? ? return[[NSStringstringWithFormat:@"%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]
]lowercaseString];
}
在程序中對用戶的登錄數(shù)據(jù)進(jìn)行加密存儲非常重要喳资。采用MD5加密后,即使數(shù)據(jù)被劫持腾供,也無法還原出原始數(shù)據(jù)(雖然說現(xiàn)在也有破解MD5的東東仆邓,后面還有公私鑰加密解密)鲜滩。
一、普通MD5加密
太簡單的MD5加密是很容易被破解节值。一般在進(jìn)行MD5加密時會使用“加鹽”的方法徙硅。簡單的MD5可到這個網(wǎng)站進(jìn)行破解:www.cmd5.com
下面是進(jìn)行MD5加密的方法: 其中token即為加鹽的字符串,可以為任意長度的奇形怪狀字符串。
如:
NSString*pwd =self.userPwdLabel.text;
//先加鹽,?用MD5加密.??(服務(wù)器簡單存儲加鹽與加密保存過的就行了).??現(xiàn)實(shí)中的情況有公鑰/私鑰,?服務(wù)器并不是簡單存儲密碼.
pwd?=?[pwd stringByAppendingString:token];
pwd?=?[pwd md5String];
NSLog(@"%@",?pwd);
然后 去發(fā)送網(wǎng)絡(luò)請求
二搞疗、更加高級的方法
用公鑰和私鑰的概念嗓蘑。
一個公鑰(對外的都知道),一個私鑰(只有服務(wù)器自己知道).密碼要動態(tài)變化才行.
*用戶:用token+時間進(jìn)行加密,傳送給服務(wù)器
*服務(wù)器:取出用戶密碼(存儲時用私鑰加過密),用時間+公鑰等與客戶端發(fā)送的密碼進(jìn)行比較.(服務(wù)器還要檢查發(fā)送密碼的時間差,1分鐘以內(nèi))
如:
第一步:先加鹽 然后md5
NSString *pwd =self.userPwdLabel.text;
//?進(jìn)行MD5加密
pwd?=?[pwd stringByAppendingString:token];
//?每次都是一樣的!例如:黑客攔截了路由器中的數(shù)據(jù)
//?就能夠獲得到加密后的密碼匿乃!
pwd?=?[pwd md5String];
第二步:公鑰加密 再M(fèi)D5
//?在服務(wù)器后臺桩皿,保存的是用私有密鑰加鹽處理的MD5密碼串
pwd?=?[NSStringstringWithFormat:@"%@%@%@",?pwd,?publicKey,@"2014062914:14:30"];
//?利用日期,可以保證加密生成的字符串不一樣
pwd?=?[pwd md5String];
//?提交給服務(wù)器的內(nèi)容:新的密碼扳埂,生成密碼的事件业簿、
/**
服務(wù)器的處理:
1.?從服務(wù)器取出用戶的密碼(是用私有密鑰加密的)
2.?服務(wù)器知道共有密鑰,根據(jù)給定的時間(動態(tài)生成新的密碼)阳懂,與客戶端提交的密碼進(jìn)行比較
3.?服務(wù)器同時需要檢查提交密碼的事件差值梅尤,跟客戶端提交的日期偏差在1分鐘之內(nèi)。
*/
NSLog(@"%@",?pwd);
[selfpostLogonWithUserName:self.userNameText.textpassword:pwd];