目前网络服务器有种流行的Restful设计风格,如下图所示:
在终端使用base64编码解码文件的方法和结果如下:
结果如下:
事实上Base64也常用于给用户的密码编码和解码。
新建工程 进行掌握 步骤如下:
代码如下:
// // ViewController.m // POST登录 // // Created by apple on 15/10/28. // Copyright (c) 2015年 LiuXun. All rights reserved. // /** 安全隐患: 尽管在发送数据的过程中,密码进行了二进制转换。但实际上,密码还是明文。 解决方法: base64编码,是网络上使用最广泛的一种编码格式 作用:可以将二进制数据转为字符串。 有的时候网络请求上,会希望只传递字符串。 1. url中的参数,会直接带上图片的传输。 2. 银联的网银接口,把整个消费凭据生成一个数据的格式进行base64的编码,编码完再传递给服务器。 base64的特点: 编码之后的结果,只有64个字符 a~z A~Z 0~9 / + 再加上一个辅助字符 = base64加密之后的好处 1、 在网络传输的过程中没有传输密码明文 2、在本地也不能存储密码的明文 */ #import "ViewController.h" #define KLoginUserNameKey @"KLoginUserNameKey" #define KLoginUserPwdKey @"KLoginUserPwdKey" @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *nameText; @property (weak, nonatomic) IBOutlet UITextField *pwdText; @end @implementation ViewController -(void)viewDidLoad { // 取出用户偏好设置保存的用户信息 self.nameText.text = [[NSUserDefaults standardUserDefaults] stringForKey:KLoginUserNameKey]; self.pwdText.text = [[NSUserDefaults standardUserDefaults] stringForKey:KLoginUserPwdKey]; self.pwdText.text = [self base64decode:self.pwdText.text]; NSLog(@"%@", NSHomeDirectory()); } - (IBAction)Click { NSString *username = self.nameText.text; // base64 加密 NSString *pass = self.pwdText.text; pass = [self base64encode:pass]; NSLog(@"%@", pass); // 1. url NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/login.php"]; // 2. POST必须是可变的请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:2.0f]; request.HTTPMethod = @"POST"; // POST 请求不需要进行百分号转义 NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@",username, pass]; request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding]; // 3. 连接 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // 反序列化 NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; NSLog(@"%@", result); if ([result [@"userId"] intValue] >0) { // 登录成功,记录用户的信息到偏好设置 [[NSUserDefaults standardUserDefaults] setObject:username forKey:KLoginUserNameKey]; [[NSUserDefaults standardUserDefaults] setObject:pass forKey:KLoginUserPwdKey]; // 为了即时保存,需要同步 [[NSUserDefaults standardUserDefaults] synchronize]; } }]; } // base64 加密(苹果已经封装好了 IOS7之后) // base64 加密的实质是 将二进制数据转为加密后的字符串 // 将密码进行base64加密的方法 -(NSString *)base64encode:(NSString *)str { // 1、把字符串转成二进制数据 NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; // 2、将二进制进行base64加密(编码) // 提示:IOS7 以后才提供的方法,也就意味着公司里比较老的项目,有可能有base64第三方的框架 return [data base64EncodedStringWithOptions:0]; } // base64解码 -(NSString *)base64decode:(NSString *)str { // 1、先把base64编码后的字符串转成二进制数据 NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:0]; // 2、 再把data转化成字符串 return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } @end为了保证用户数据的安全性,服务器端的密码也是加密后的,所以为了模拟 将本地服务器的login.php的密码验证也改为Base64编码后的密码字符串 如下所示:
由于Itool等工具可以直接获取用户的本地数据,所以 在用户的偏好设置以及本地数据文件中也不能直接保存用户的密码。经Base64加密后,进行运行 打开用户的偏好设置的PList文件如下
后台运行输出如下: