////? ViewController.m//? 04-POST請求模擬登錄////? Created by Shenzhen_iOS_07 on 16/10/29.//? Copyright ? 2016年 Shenzhen_iOS_07. All rights reserved.? ? ? /******************** MD5 加密簡介? *****************************//*? ? 1.md5簡單的說就是對你對你的密碼進行處理復雜化, 注意的是你單獨對密碼加密,怎么去和后臺密碼進行匹配,所以一般加密算法是后臺提供的,,客戶端和后臺保證一致的加密算法才能匹配成功. 比如將"zhang"的字符創進行加密后得出"dgsjdfjsk32786^%#$%$^fmnnkdcjfsfds",這個字符串,我們就用這個字符串去登錄后臺服務器,后臺服務器也會對"zhang"字符串進行加密由于算法相同得出的結果也會相同"dgsjdfjsk32786^%#$%$^fmnnkdcjfsfds". 所以匹配到后就登錄成功了;? ? 2.加密成功后在網路請求中傳輸的就是你加密后的密碼,,,,別人不知道你的加密算法,是逆推不到你加密前的密碼? ? 3.使用操作很簡單:首先直接拷貝"Security"文件夾導入到你的項目中,文件夾中包含各種字符串的加密算法..可供選擇.? ? ? ? 4.具體操作參考下列實例代碼,實現過程簡單,,注釋很詳細 */#import "MD5VC.h"#import "NSString+Hash.h"#import "SSKeychain.h"@interface MD5VC ()@property (weak, nonatomic) IBOutlet UITextField *nameTextField;@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;@end@implementation MD5VC- (void)viewDidLoad {? ? [super viewDidLoad];? ? ? ? // 程序一啟動,就讀取本地的用戶信息;如果有,就展示到輸入框.沒有就自己輸入? ? [self readUserInfo];}/* 加密 密碼在網絡中傳輸之前,加密 (MD5) 密碼保存到本地之前,加密 (SSKeychain)? 解密 密碼在展示和使用之前,解密 (SSKeychain) */// POST請求模擬登錄- (IBAction)login:(id)sender{? ? // 1.URL (POST請求的URL沒有參數,參數封裝在請求體)? ? NSURL *URL = [NSURL URLWithString:@"http://localhost/php/login/login.php"];? ? ? ? // 2.創建請求可變對象? ? NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:URL];? ? // 2.1 設置請求方法為POST? ? requestM.HTTPMethod = @"POST";? ? // 2.2 設置請求體 : 二進制的數據? ? requestM.HTTPBody = [self getHTTPBody];? ? ? ? // 2.獲取單例session,發起任務,啟動任務? ? [[[NSURLSession sharedSession] dataTaskWithRequest:requestM completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {? ? ? ? ? ? ? ? // 3.處理響應? ? ? ? if (error == nil && data != nil) {? ? ? ? ? ? // 4.反序列化? ? ? ? ? ? NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];? ? ? ? ? ? // 5.判斷是否登錄成功? ? ? ? ? ? if ([result[@"userId"] intValue] == 1) {? ? ? ? ? ? ? ? NSLog(@"登錄成功");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 登錄成功之后,保存用戶信息? ? ? ? ? ? ? ? [self saveUserInfo];? ? ? ? ? ? ? ? ? ? ? ? ? ? } else {? ? ? ? ? ? ? ? NSLog(@"登錄失敗");? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? } else {? ? ? ? ? ? NSLog(@"%@",error);? ? ? ? }? ? ? ? ? ? }] resume];}// 獲取請求體二進制的主方法- (NSData *)getHTTPBody{#pragma mark-MD5加鹽,加兩勺勺鹽 : 后臺設計的鹽? ? NSString *salt = @"!@#ZXCasd258";? ? NSString *encodePsd = [self.passwordTextField.text hmacMD5StringWithKey:salt];? ? ? ? // 把加密之后的密碼,放進請求體? ? NSString *body = [NSString stringWithFormat:@"username=%@&password=%@",self.nameTextField.text,encodePsd];? ? // 把請求體字符串轉成二進制形式的請求體;dataUsingEncoding : 直接把字符串轉成二進制? ? NSData *HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];? ? ? ? return HTTPBody;}// 保存用戶信息到偏好設置- (void)saveUserInfo{? ? // 保存用戶名? ? [[NSUserDefaults standardUserDefaults] setObject:self.nameTextField.text forKey:@"name"];? ? ? ? // 需求 : 密碼保存到本地,需要加密和能夠解密 (鑰匙串)? ? /*? ? 參數1 : 你要保存到鑰匙串的密碼? ? 參數2 : APP的唯一標識符,為哪個APP保存密碼? ? 參數3 : 為哪個APP里面的哪個賬號保存密碼? ? ? ? ? 提示 : 因為XCode8需要開啟鑰匙串的權限;XCode7不需要? ? */? ? BOOL isSaved = [SSKeychain setPassword:self.passwordTextField.text forService:[NSBundle mainBundle].bundleIdentifier account:self.nameTextField.text];? ? NSLog(@"%d",isSaved);}// 讀取用戶信息- (void)readUserInfo{? ? // 讀取用戶名? ? self.nameTextField.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];? ? ? ? // 從鑰匙串中讀取密碼? ? /*? ? 參數1 : 讀取哪個APP的密碼? ? 參數2 : 讀取哪個APP的哪個賬號的密碼? ? */? ? NSString *decodePsd = [SSKeychain passwordForService:[NSBundle mainBundle].bundleIdentifier account:self.nameTextField.text];? ? ? ? // 讀取密碼? ? self.passwordTextField.text = decodePsd;}-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
{
[self dismissModalViewControllerAnimated:YES];
}
@end