Base64编码加密的介绍与使用

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


后台运行输出如下:



你可能感兴趣的:(Base64编码加密的介绍与使用)