iOS加密2——Base64(苹果支持)
Base64编码可用于在HTTP环境下传递较长的标识信息。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
在网络请求中,直接发送密码是不安全的!
安全原则: 凡是涉及到私密信息的发送,都不能够发送明文,需要加密之后再发送.
base64 : 将原来 8个 bit 为一个字节的数据 6个 bit 为一个单位处理. 导致 数据量会增大,增大 (8-6)/6 = 1/3.不足的部分用 0 补齐.每两个0 就用一个 = 表示.
base64 可以对任意的文件进行加密.
base64 过程是可逆的. 可以反向解密.
Base64编码的作用和比较
1、由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。
Base64编码使用和urlencode比较
base64:
1、包含A-Z a-z 0-9 和加号“+”,斜杠“/” 用来作为开始的64个数字. 等号“=”用来作为后缀用途。
2、2进制的.
3、要比源数据多33%。
4、常用于邮件。
urlencode:将除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)
请求参数传输使用base64,而不是使用urlencode,为什么?
1、部分因为base64编码后参数就不可读,而url编码英文部分是不变的
2、为了兼容网络上的一些很古老的设备, 这些古董设备只能识别 base64编码的字符
3、因为 urlencode 对二进制数据的效率不高,base64 会有效降低 %xx 的出现次数。
注释:
1、url请求中,只对参数进行base64编码,不是对整个url进行base64编码。
2、在url请求时,会对url整体进行urlencode编码。
代码部分
对这个字符串进行 base64 加密
1> 需要将原来的数据转换成二进制数据NSData.
2> 将data进行base64编码---加密
NSString *str = @"hello world"; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; NSData *base64Data = [data base64EncodedDataWithOptions:0];
对一张图片进行 base64 加密
1> 将本地图片路径转换成二进制数据NSData.
2> 将data进行base64编码---加密
3>将编码后的basedata写入文件。
NSString *path = @"/Users/apple/Desktop/1.png"; NSData *data = [NSData dataWithContentsOfFile:path]; NSData *base64Data = [data base64EncodedDataWithOptions:0]; [base64Data writeToFile:@"/Users/apple/Desktop/base64" atomically:YES];
对这个字符串进行 base64 解密
1> 返回的是 base64 加密之后的字符串.
NSString *base64Str = [data base64EncodedStringWithOptions:0]; NSLog(@"base64Str: %@",base64Str); NSLog(@"%@ %ld base64Data: %@ %ld",data,data.length,base64Data,base64Data.length);
对一张图片进行 base64 解密
1> 将base64Data进行解密转成NSData类型的endata
2> 将endata进行写入文件存放
3>将endata转换成image
NSData *endata = [[NSData alloc] initWithBase64EncodedData:base64Data options:0]; [endata writeToFile:@"/Users/apple/Desktop/123.png2" atomically:YES]; UIImage *image = [UIImage imageWithData:endata]; NSLog(@"%@",image);
代码将base64进行方法封装
和MD5一样我们采取封装的办法将base64封装进了MySecurities这个类中
MySecurities.h 文件
#import <Foundation/Foundation.h> @interface MySecurities : NSObject +(NSString *)base64EncodingWithData:(NSData *)sourceData;//base64加密 +(id)base64EncodingWithString:(NSString *)sourceString;//base64解密 @end
base64加密
@implementation MySecurities +(NSString *)base64EncodingWithData:(NSData *)sourceData{ if (!sourceData) { //如果sourceData则返回nil,不进行加密。 return nil; } NSString *resultString = [sourceData base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength]; return resultString; } ***base64解密*** +(id)base64EncodingWithString:(NSString *)sourceString{ if (!sourceString) { return nil;//如果sourceString则返回nil,不进行解密。 } NSData *resultData = [[NSData alloc]initWithBase64EncodedString:sourceString options:NSDataBase64DecodingIgnoreUnknownCharacters]; return resultData; } @end