MD5加密詳解

////? ViewController.m//? 04-POST請(qǐng)求模擬登錄////? Created by Shenzhen_iOS_07 on 16/10/29.//? Copyright ? 2016年 Shenzhen_iOS_07. All rights reserved.? ? ? /******************** MD5 加密簡(jiǎn)介? *****************************//*? ? 1.md5簡(jiǎn)單的說就是對(duì)你對(duì)你的密碼進(jìn)行處理復(fù)雜化, 注意的是你單獨(dú)對(duì)密碼加密,怎么去和后臺(tái)密碼進(jìn)行匹配,所以一般加密算法是后臺(tái)提供的,,客戶端和后臺(tái)保證一致的加密算法才能匹配成功. 比如將"zhang"的字符創(chuàng)進(jìn)行加密后得出"dgsjdfjsk32786^%#$%$^fmnnkdcjfsfds",這個(gè)字符串,我們就用這個(gè)字符串去登錄后臺(tái)服務(wù)器,后臺(tái)服務(wù)器也會(huì)對(duì)"zhang"字符串進(jìn)行加密由于算法相同得出的結(jié)果也會(huì)相同"dgsjdfjsk32786^%#$%$^fmnnkdcjfsfds". 所以匹配到后就登錄成功了;? ? 2.加密成功后在網(wǎng)路請(qǐng)求中傳輸?shù)木褪悄慵用芎蟮拿艽a,,,,別人不知道你的加密算法,是逆推不到你加密前的密碼? ? 3.使用操作很簡(jiǎn)單:首先直接拷貝"Security"文件夾導(dǎo)入到你的項(xiàng)目中,文件夾中包含各種字符串的加密算法..可供選擇.? ? ? ? 4.具體操作參考下列實(shí)例代碼,實(shí)現(xiàn)過程簡(jiǎn)單,,注釋很詳細(xì) */#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];? ? ? ? // 程序一啟動(dòng),就讀取本地的用戶信息;如果有,就展示到輸入框.沒有就自己輸入? ? [self readUserInfo];}/* 加密 密碼在網(wǎng)絡(luò)中傳輸之前,加密 (MD5) 密碼保存到本地之前,加密 (SSKeychain)? 解密 密碼在展示和使用之前,解密 (SSKeychain) */// POST請(qǐng)求模擬登錄- (IBAction)login:(id)sender{? ? // 1.URL (POST請(qǐng)求的URL沒有參數(shù),參數(shù)封裝在請(qǐng)求體)? ? NSURL *URL = [NSURL URLWithString:@"http://localhost/php/login/login.php"];? ? ? ? // 2.創(chuàng)建請(qǐng)求可變對(duì)象? ? NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:URL];? ? // 2.1 設(shè)置請(qǐng)求方法為POST? ? requestM.HTTPMethod = @"POST";? ? // 2.2 設(shè)置請(qǐng)求體 : 二進(jìn)制的數(shù)據(jù)? ? requestM.HTTPBody = [self getHTTPBody];? ? ? ? // 2.獲取單例session,發(fā)起任務(wù),啟動(dòng)任務(wù)? ? [[[NSURLSession sharedSession] dataTaskWithRequest:requestM completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {? ? ? ? ? ? ? ? // 3.處理響應(yīng)? ? ? ? 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];}// 獲取請(qǐng)求體二進(jìn)制的主方法- (NSData *)getHTTPBody{#pragma mark-MD5加鹽,加兩勺勺鹽 : 后臺(tái)設(shè)計(jì)的鹽? ? NSString *salt = @"!@#ZXCasd258";? ? NSString *encodePsd = [self.passwordTextField.text hmacMD5StringWithKey:salt];? ? ? ? // 把加密之后的密碼,放進(jìn)請(qǐng)求體? ? NSString *body = [NSString stringWithFormat:@"username=%@&password=%@",self.nameTextField.text,encodePsd];? ? // 把請(qǐng)求體字符串轉(zhuǎn)成二進(jìn)制形式的請(qǐng)求體;dataUsingEncoding : 直接把字符串轉(zhuǎn)成二進(jìn)制? ? NSData *HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];? ? ? ? return HTTPBody;}// 保存用戶信息到偏好設(shè)置- (void)saveUserInfo{? ? // 保存用戶名? ? [[NSUserDefaults standardUserDefaults] setObject:self.nameTextField.text forKey:@"name"];? ? ? ? // 需求 : 密碼保存到本地,需要加密和能夠解密 (鑰匙串)? ? /*? ? 參數(shù)1 : 你要保存到鑰匙串的密碼? ? 參數(shù)2 : APP的唯一標(biāo)識(shí)符,為哪個(gè)APP保存密碼? ? 參數(shù)3 : 為哪個(gè)APP里面的哪個(gè)賬號(hào)保存密碼? ? ? ? ? 提示 : 因?yàn)閄Code8需要開啟鑰匙串的權(quán)限;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"];? ? ? ? // 從鑰匙串中讀取密碼? ? /*? ? 參數(shù)1 : 讀取哪個(gè)APP的密碼? ? 參數(shù)2 : 讀取哪個(gè)APP的哪個(gè)賬號(hào)的密碼? ? */? ? 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容