在做網路應用程式的時候, 時時刻刻要保證使用者資料的安全, 因此要加密。MD5演算法在國內用的很多.
MD5演算法的特點:*同樣的資料加密結果是一樣的.(32個字元)*無法復原的.(不能逆向解密)*可用於檔案校正/指紋識別.
MD5演算法是公開的,iOS中已經封裝好了MD5演算法。可以將其寫成字串的分類:
- (NSString *)md5String{const char *string = self.UTF8String;int length = (int)strlen(string);unsigned char bytes[CC_MD5_DIGEST_LENGTH];CC_MD5(string, length, bytes);return [self stringFromBytes:bytes length:CC_MD5_DIGEST_LENGTH];}
在iOS程式中對使用者的登入資料進行加密儲存非常重要。做到,即使資料被劫持,也無法還原出未經處理資料的地步。
一、普通MD5加密
太簡單的MD5加密很容易被破解。一般在進行MD5加密時會使用
“加佐料”的方法。
簡單的MD5可到這個網站進行破解:www.cmd5.com
下面是進行MD5加密的方法: 其中
token即為加的字串,可以為任意長度的奇形怪狀字串。
- (IBAction)login:(UIButton *)sender {[self postLogin];}/**提交使用者資料的時候用post相對安全. 同時將使用者資料轉換成模型最好*/- (void)postLogin {//1.URLNSString *urlStr = [NSString stringWithFormat:@"http://localhost/login.php"];NSURL *url = [NSURL URLWithString:urlStr];//2.建立 MutablerequestNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];//3.設定request.HTTPMethod = @"POST";//請求體可在firebug中找NSString *pwd = self.userPwd.text;//先加鹽, 用MD5加密. (伺服器簡單儲存加鹽與加密儲存過的就行了). 現實中的情況有公開金鑰/私密金鑰, 伺服器並不是簡單儲存密碼.pwd = [pwd stringByAppendingString:token];pwd = [pwd md5String];NSLog(@"%@", pwd);NSString *body = [NSString stringWithFormat:@"username=%@&password=%@", self.userName.text, pwd];request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];//4.建立串連. (data即為取到的資料, 和get一樣)[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler: ^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@, %@", [NSThread currentThread], str); //更新顯示需要在主線程中 [[NSOperationQueue mainQueue] addOperationWithBlock: ^{ self.label.text = str; NSLog(@"%@, %@", [NSThread currentThread], str);}];}];}
二、更加進階的方法
用公開金鑰和私密金鑰的概念。
一個公開金鑰(都知道),一個私密金鑰(只有伺服器自己知道).密碼要動態變化才行.*使用者:用token+時間進行加密,傳送給伺服器*伺服器: 取出使用者密碼(儲存時用私密金鑰加過密),用時間+公開金鑰等與用戶端發送的密碼進行比較.(伺服器還要檢查發送密碼的時間差,1分鐘以內)
詳細見注釋:摘自老劉。
- (IBAction)login:(id)sender{ NSString *pwd = self.pwdText.text; // 進行MD5加密 pwd = [pwd stringByAppendingString:token]; // 每次都是一樣的!例如:駭客攔截了路由器中的資料 // 就能夠獲得到加密後的密碼! pwd = [pwd md5String]; // 在伺服器後台,儲存的是用私人密鑰加鹽處理的MD5密碼串 pwd = [NSString stringWithFormat:@"%@%@%@", pwd, publicKey, @"2014062914:14:30"]; // 利用日期,可以保證加密產生的字串不一樣 pwd = [pwd md5String]; // 提交給伺服器的內容:新的密碼,產生密碼的事件、 /** 伺服器的處理: 1. 從伺服器取出使用者的密碼(是用私人祕密金鑰加密的) 2. 伺服器知道共有密鑰,根據給定的時間(動態產生新的密碼),與用戶端提交的密碼進行比較 3. 伺服器同時需要檢查提交密碼的事件差值,跟用戶端提交的日期偏差在1分鐘之內。 */ NSLog(@"%@", pwd); [self postLogonWithUserName:self.userNameText.text password:pwd];}#pragma mark - POST登入- (void)postLogonWithUserName:(NSString *)userName password:(NSString *)password{ // 1. url NSString *urlStr = @"http://192.168.25.2/login.php"; NSURL *url = [NSURL URLWithString:urlStr]; // 2. request,POST方法,需要建立一個可變的請求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 1> POST 方法,所有涉及使用者隱私的資料傳遞,都需要用POST方式提交! request.HTTPMethod = @"POST"; // 2> 資料體 NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@", userName, password]; // 將字串轉換成位元據 request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding]; // 3. 發送“非同步”請求,在其他線程工作,不阻塞當前線程程式執行 [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // 1> JSON,格式是和NSDictionary的快速封裝格式非常 // 將JSON轉換成字典 Serialization NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:1 error:NULL]; CZUserInfo *userInfo = [CZUserInfo userInfoWithDict:dict]; NSLog(@"%@ %@", userInfo.userId, userInfo.userName); }]; NSLog(@"=======");}
轉載請註明出處:http://blog.csdn.net/xn4545945