目前网络服务器有种流行的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文件如下
后台运行输出如下: