Base64編碼可用于在HTTP環(huán)境下傳遞較長(zhǎng)的標(biāo)識(shí)信息。采用Base64編碼不僅比較簡(jiǎn)短,同時(shí)也具有不可讀性,即所編碼的數(shù)據(jù)不會(huì)被人用肉眼所直接看到。
在網(wǎng)絡(luò)請(qǐng)求中,直接發(fā)送密碼是不安全的!
安全原則: 凡是涉及到私密信息的發(fā)送,都不能夠發(fā)送明文,需要加密之后再發(fā)送.
base64 : 將原來(lái) 8個(gè) bit 為一個(gè)字節(jié)的數(shù)據(jù) 6個(gè) bit 為一個(gè)單位處理. 導(dǎo)致 數(shù)據(jù)量會(huì)增大,增大 (8-6)/6 = 1/3.不足的部分用 0 補(bǔ)齊.每?jī)蓚€(gè)0 就用一個(gè) = 表示.
base64 可以對(duì)任意的文件進(jìn)行加密.
base64 過(guò)程是可逆的. 可以反向解密.
Base64編碼的作用和比較
1、由于某些系統(tǒng)中只能使用ASCII字符。Base64就是用來(lái)將非ASCII字符的數(shù)據(jù)轉(zhuǎn)換成ASCII字符的一種方法。
Base64編碼使用和urlencode比較
base64:
1、包含A-Z a-z 0-9 和加號(hào)“+”,斜杠“/” 用來(lái)作為開(kāi)始的64個(gè)數(shù)字. 等號(hào)“=”用來(lái)作為后綴用途。
2、2進(jìn)制的.
3、要比源數(shù)據(jù)多33%。
4、常用于郵件。
urlencode:將除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(hào)(%)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(hào)(+)
請(qǐng)求參數(shù)傳輸使用base64,而不是使用urlencode,為什么?
1、部分因?yàn)閎ase64編碼后參數(shù)就不可讀,而url編碼英文部分是不變的
2、為了兼容網(wǎng)絡(luò)上的一些很古老的設(shè)備, 這些古董設(shè)備只能識(shí)別 base64編碼的字符
3、因?yàn)?urlencode 對(duì)二進(jìn)制數(shù)據(jù)的效率不高,base64 會(huì)有效降低 %xx 的出現(xiàn)次數(shù)。
注釋:
1、url請(qǐng)求中,只對(duì)參數(shù)進(jìn)行base64編碼,不是對(duì)整個(gè)url進(jìn)行base64編碼。
2、在url請(qǐng)求時(shí),會(huì)對(duì)url整體進(jìn)行urlencode編碼。
代碼部分
對(duì)這個(gè)字符串進(jìn)行 base64 加密
1> 需要將原來(lái)的數(shù)據(jù)轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)NSData.
2> 將data進(jìn)行base64編碼---加密
NSString *str = @"hello world"; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; NSData *base64Data = [data base64EncodedDataWithOptions:0];
對(duì)一張圖片進(jìn)行 base64 加密
1> 將本地圖片路徑轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)NSData.
2> 將data進(jìn)行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];
對(duì)這個(gè)字符串進(jìn)行 base64 解密
1> 返回的是 base64 加密之后的字符串.
NSString *base64Str = [data base64EncodedStringWithOptions:0]; NSLog(@"base64Str: %@",base64Str); NSLog(@"%@ %ld base64Data: %@ %ld",data,data.length,base64Data,base64Data.length);
對(duì)一張圖片進(jìn)行 base64 解密
1> 將base64Data進(jìn)行解密轉(zhuǎn)成NSData類型的endata
2> 將endata進(jìn)行寫入文件存放
3>將endata轉(zhuǎn)換成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進(jìn)行方法封裝
和MD5一樣我們采取封裝的辦法將base64封裝進(jìn)了MySecurities這個(gè)類中
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,不進(jìn)行加密。 return nil; } NSString *resultString = [sourceData base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength]; return resultString; } ***base64解密*** +(id)base64EncodingWithString:(NSString *)sourceString{ if (!sourceString) { return nil;//如果sourceString則返回nil,不進(jìn)行解密。 } NSData *resultData = [[NSData alloc]initWithBase64EncodedString:sourceString options:NSDataBase64DecodingIgnoreUnknownCharacters]; return resultData; } @end