轉(zhuǎn)載 https://blog.csdn.net/qq_30513483/article/details/60143441
寫在前面
在寫項(xiàng)目中,數(shù)據(jù)的安全性至關(guān)重要,而僅僅用 POST 請(qǐng)求提交用戶的隱私數(shù)據(jù),還是不能完全解決安全問題。因此:我們經(jīng)常會(huì)用到加密技術(shù),比如說在登錄的時(shí)候,我們會(huì)先把密碼用MD5加密再傳輸給服務(wù)器 或者 直接對(duì)所有的參數(shù)進(jìn)行加密再POST到服務(wù)器。
記得最初接觸加密,也不懂,就根據(jù)文檔,用的是 md5,直接調(diào)一方法就OK 了(感覺加密也簡(jiǎn)單的)-->淡淡的一笑!
相信很多開發(fā)者跟我當(dāng)初一樣,只是根據(jù)項(xiàng)目經(jīng)理或者文檔指示進(jìn)行加密,簡(jiǎn)單會(huì)使用 但并不知道加密知識(shí)體系和內(nèi)在原理,于是整理了一份相關(guān)資料。時(shí)間有限,知識(shí)并未全覆蓋,有遺漏或者錯(cuò)誤,忘指正。
目錄:
- 數(shù)據(jù)安全介紹
- 常用加密算法
- 常用加密方式
- Base64編碼方案
- 加密實(shí)現(xiàn)代碼
5.1 MD5加密算法
5.2 對(duì)稱加密算法AES和DES
5.3 非對(duì)稱加密RSA- HTTPS基本使用
- 數(shù)據(jù)安全–加密解密效果
加密實(shí)戰(zhàn)應(yīng)用場(chǎng)景(持續(xù)更新)
1.數(shù)據(jù)安全介紹
-
最基礎(chǔ)的是我們發(fā)送網(wǎng)絡(luò)請(qǐng)求時(shí),使用
get和post方式發(fā)送請(qǐng)求。兩者具體區(qū)別就不做解釋了,只是引出相關(guān)安全性問題-
get:將參數(shù)暴露在外,(絕對(duì)不安全-->明文請(qǐng)求或者傻瓜式請(qǐng)求)。 -
post:將參數(shù)放到請(qǐng)求體body中,(相對(duì)于get比較安全-->但是我們可以很容易用一些軟件截獲請(qǐng)求數(shù)據(jù)。比如說Charles(青花瓷))
-
-
Charles(大部分app的數(shù)據(jù)來源都使用該工具來抓包,并做網(wǎng)絡(luò)測(cè)試) -
數(shù)據(jù)安全的原則
- 在網(wǎng)絡(luò)上
不允許傳輸用戶隱私數(shù)據(jù)的明文,(即:App網(wǎng)絡(luò)傳輸安全,指對(duì)數(shù)據(jù)從客戶端傳輸?shù)絊erver中間過程的加密,防止網(wǎng)絡(luò)世界當(dāng)中其他節(jié)點(diǎn)對(duì)數(shù)據(jù)的竊聽)。 - 在本地
不允許保存用戶隱私數(shù)據(jù)的明文,(即:App數(shù)據(jù)存儲(chǔ)安全,主要指在磁盤做數(shù)據(jù)持久化的時(shí)候所做的加密)。 - App
代碼安全,(即:包括代碼混淆,加密或者app加殼)。
- 在網(wǎng)絡(luò)上
要想非常安全的傳輸數(shù)據(jù),建議使用https。抓包不可以,但是中間人攻擊則有可能。建議雙向驗(yàn)證防止中間人攻擊,可以參考下文篇章。
2.常用加密算法
| 常用加密算法 | 名稱 |
|---|---|
| 編碼方案 | Base64 |
| 哈希(散列)函數(shù) | MD5(消息摘要算法) |
| SHA1 | |
| SHA256 | |
| 對(duì)稱加密算法 | DES |
| AES | |
| 非對(duì)稱加密算法 | RSA |
| HTTPS | HTTP+SSL協(xié)議 |
3.常用加密方式
| 常用加密方式 |
|---|
| 1.通過簡(jiǎn)單 BASE64編碼 防止數(shù)據(jù)明文傳輸 |
| 2.對(duì)普通請(qǐng)求、返回?cái)?shù)據(jù),生成MD5校驗(yàn)(MD5中加入動(dòng)態(tài)密鑰),進(jìn)行數(shù)據(jù)完整性(簡(jiǎn)單防篡改,安全性較低,優(yōu)點(diǎn):快速)校驗(yàn) |
| 3.對(duì)于重要數(shù)據(jù),使用RSA進(jìn)行數(shù)字簽名,起到防篡改作 |
| 4.對(duì)于比較敏感的數(shù)據(jù),如用戶信息(登陸、注冊(cè)等),客戶端發(fā)送使用RSA加密,服務(wù)器返回使用DES(AES)加密 |
| 5.要想非常安全的傳輸數(shù)據(jù),建議使用https。抓包不可以,但是中間人攻擊則有可能。建議雙向驗(yàn)證防止中間人攻擊 |
4.Base64編碼方案
Base64簡(jiǎn)單說明
描述:Base64可以成為密碼學(xué)的基石,非常重要。
特點(diǎn):可以將任意的二進(jìn)制數(shù)據(jù)進(jìn)行Base64編碼
結(jié)果:所有的數(shù)據(jù)都能被編碼為并只用65個(gè)字符(A~Z a~z 0~9 + / =)就能表示的文本文件。
注意:對(duì)文件進(jìn)行base64編碼后文件數(shù)據(jù)的變化:編碼后的數(shù)據(jù)~=編碼前數(shù)據(jù)的4/3,會(huì)大1/3左右。Base64編碼原理和處理過程
| Base64編碼原理 |
|---|
| 1、將所有字符轉(zhuǎn)化為ASCII碼 |
| 2、將ASCII碼轉(zhuǎn)化為8位二進(jìn)制 |
| 3、將二進(jìn)制3個(gè)歸成一組(不足3個(gè)在后邊補(bǔ)0)共24位,再拆分成4組,每組6位 |
| 4、統(tǒng)一在6位二進(jìn)制前補(bǔ)兩個(gè)0湊足8位 |
| 5、將補(bǔ)0后的二進(jìn)制轉(zhuǎn)為十進(jìn)制 |
| 6、從Base64編碼表獲取十進(jìn)制對(duì)應(yīng)的Base64編碼 |
| Base64處理過程 |
| 1、轉(zhuǎn)換的時(shí)候,將三個(gè)byte的數(shù)據(jù),先后放入一個(gè)24bit的緩沖區(qū)中,先來的byte占高位。 |
| 2、數(shù)據(jù)不足3byte的話,于緩沖區(qū)中剩下的bit用0補(bǔ)足。然后,每次取出6個(gè)bit,按照其值選擇查表選擇對(duì)應(yīng)的字符作為編碼后的輸出。 |
| 3、不斷進(jìn)行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成。 |
| 4、如果最后剩下兩個(gè)輸入數(shù)據(jù),在編碼結(jié)果后加1個(gè)“=”; |
| 5、如果最后剩下一個(gè)輸入數(shù)據(jù),編碼結(jié)果后加2個(gè)“=”; |
| 6、如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。 |
在這里提供幾張圖結(jié)合上面的處理過程,好理解。
- Base64實(shí)現(xiàn)代碼
簡(jiǎn)單方法直接拿走,調(diào)用
// 對(duì)一個(gè)字符串進(jìn)行base64編碼,并且返回-(NSString *)base64EncodeString:(NSString *)string { // 1.先轉(zhuǎn)換為二進(jìn)制數(shù)據(jù) NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; // 2.對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼,完成之后返回字符串 return [data base64EncodedStringWithOptions:0];} // 對(duì)base64編碼之后的字符串解碼,并且返回-(NSString *)base64DecodeString:(NSString *)string { // 注意:該字符串是base64編碼后的字符串 // 1.轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)(完成了解碼的過程) NSData *data = [[NSData alloc]initWithBase64EncodedString:string options:0]; // 2.把二進(jìn)制數(shù)據(jù)在轉(zhuǎn)換為字符串 return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];} //---------------------------<#我是分割線#>------------------------------// NSLog(@"%@",[self base64EncodeString:@"A"]);NSLog(@"%@",[self base64DecodeString:@"QQ=="]);
PS.終端執(zhí)行編碼和解碼
如:編碼:base64 123.png -o 123.txt解碼:base64 123.txt -o test.png -D
4.加密實(shí)現(xiàn)代碼
哈希(散列)函數(shù)
特點(diǎn):
- 算法是公開的
- 對(duì)相同的數(shù)據(jù)加密,得到的結(jié)果是一樣的"
- 對(duì)不同的數(shù)據(jù)加密,得到的結(jié)果是定長(zhǎng)的,MD5對(duì)不同的數(shù)據(jù)進(jìn)行加密,得到的結(jié)果都是 32 個(gè)字符長(zhǎng)度的字符串
- 信息摘要,信息"指紋",是用來做數(shù)據(jù)識(shí)別的!
- 不能逆推反算(重要)
用途:
- 版權(quán) 對(duì)文件進(jìn)行散列判斷該文件是否是正版或原版的
- 文件完整性驗(yàn)證 對(duì)整個(gè)文件進(jìn)行散列,比較散列值判斷文件是否完整或被篡改
- 密碼加密,服務(wù)器并不需要知道用戶真實(shí)的密碼!
- 搜索:
如:百度搜索-->老司機(jī) 皮皮蝦 蒼老師
或是 【蒼老師 老司機(jī) 皮皮蝦 】
上面兩種方式搜索出來的內(nèi)容是一樣的- 如何判斷:對(duì)搜索的每個(gè)關(guān)鍵字進(jìn)行三列,得到三個(gè)相對(duì)應(yīng)的結(jié)果,按位相加結(jié)果如果是一樣的,那搜索的內(nèi)容就是一樣的!
- 經(jīng)典加密算法:
MD5、SHA1、SHA512
MD5消息摘要算法
-
簡(jiǎn)單介紹:
- MD5:全稱是Message Digest Algorithm 5,譯為“消息摘要算法第5版”(經(jīng)MD2、MD3和MD4發(fā)展而來)
- 效果:對(duì)輸入信息生成唯一的128位散列值(32個(gè)字符),即 32個(gè)16進(jìn)制的數(shù)字。
-
特點(diǎn):
- 輸入兩個(gè)不同的明文不會(huì)得到相同的輸出值
- 根據(jù)輸出值,不能得到原始的明文,即其過程不可逆(只能加密, 不能解密)
-
應(yīng)用:
- 現(xiàn)在的MD5已不再是絕對(duì)安全(如:暴力破解的網(wǎng)站),對(duì)此,可以對(duì)MD5稍作改進(jìn),以增加解密的難度。
- 解決:加鹽(Salt):在明文的固定位置插入隨機(jī)串,然后再進(jìn)行MD5(先加密,后亂序:先對(duì)明文進(jìn)行MD5,然后對(duì)加密得到的MD5串的字符進(jìn)行亂序)
-
注意點(diǎn):
- 開發(fā)中,一定要和后臺(tái)開發(fā)人員約定好,MD5加密的位數(shù)是16位還是32位(大多數(shù)都是32位的),16位的可以通過32位的轉(zhuǎn)換得到。
- MD5加密區(qū)分 大小寫,使用時(shí)要和后臺(tái)約定好。
- MD5公認(rèn)被破解不代表其可逆,而是一段字符串加密后的密文,可以通過強(qiáng)大運(yùn)算計(jì)算出字符串加密后的密文對(duì)應(yīng)的原始字符串,但也不是絕對(duì)的被破解。
PS.暴力破解是指通過將明文和生成的密文進(jìn)行配對(duì),生成強(qiáng)大的數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)中搜索,在這里就可以破解密碼。破解網(wǎng)址 http://www.cmd5.com
提升MD5加密安全性,解決辦法
1.先明文加鹽,然后再進(jìn)行MD5。即明文后拼接字符串(此時(shí)拼接的字符串要 足夠長(zhǎng)+足夠咸+足夠復(fù)雜),再進(jìn)行MD5加密。如:
#define salt @"1342*&%&shlfhs390(*^^6R%@@KFGKF"2.先加密+亂序
3.亂序|加鹽,多次MD5加密等
4.使用消息認(rèn)證機(jī)制HMAC:給定一個(gè)"秘鑰",對(duì)明文進(jìn)行加密,并且做"兩次散列"!-> 得到的結(jié)果,還是 32 個(gè)字符,相對(duì)安全(KEY是服務(wù)器傳給你的,不是你寫死的)。
消息認(rèn)證機(jī)制(HMAC)簡(jiǎn)單說明
- 原理
- 消息的發(fā)送者和接收者有一個(gè)共享密鑰
- 發(fā)送者使用共享密鑰對(duì)消息加密計(jì)算得到MAC值(消息認(rèn)證碼)
- 消息接收者使用共享密鑰對(duì)消息加密計(jì)算得到MAC值
- 比較兩個(gè)MAC值是否一致
- 使用
- 客戶端需要在發(fā)送的時(shí)候把(消息)+(消息·HMAC)一起發(fā)送給服務(wù)器
- 服務(wù)器接收到數(shù)據(jù)后,對(duì)拿到的消息用共享的KEY進(jìn)行HMAC,比較是否一致,如果一致則信任
簡(jiǎn)單示例
#pragma mark - md5加密方法- (NSString *)md5String { const char *str = self.UTF8String; uint8_t buffer[CC_MD5_DIGEST_LENGTH]; CC_MD5(str, (CC_LONG)strlen(str), buffer); return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];} #pragma mark - HMACMD5加密方法- (NSString *)hmacMD5StringWithKey:(NSString *)key { const char *keyData = key.UTF8String; const char *strData = self.UTF8String; uint8_t buffer[CC_MD5_DIGEST_LENGTH]; CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer); return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];} /** * 返回二進(jìn)制 Bytes 流的字符串表示形式 * @param bytes 二進(jìn)制 Bytes 數(shù)組 * @param length 數(shù)組長(zhǎng)度 * @return 字符串表示形式 */- (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length { NSMutableString *strM = [NSMutableString string]; for (int i = 0; i < length; i++) { [strM appendFormat:@"%02x", bytes[i]]; } return [strM copy];} //---------------------------<#我是分割線#>------------------------------// // md5加密調(diào)用NSLog(@"%@",[@"520it" md5String]); // (明文+加鹽)MD5加密調(diào)用NSLog(@"%@",[[@"520it" stringByAppendingString:salt] md5String]); // hmacMD5加密調(diào)用(先加密+亂序)NSLog(@"%@",[@"520it" hmacMD5StringWithKey:@"xiaomage"]);
對(duì)稱加密算法AES和DES
- 對(duì)稱加密的特點(diǎn)
- 加密/解密使用相同的密鑰
- 加密和解密的過程是可逆的
- 經(jīng)典算法
- DES 數(shù)據(jù)加密標(biāo)準(zhǔn)
- AES 高級(jí)加密標(biāo)準(zhǔn)
- 提示:
- 加密過程是先加密,再base64編碼
- 解密過程是先base64解碼,再解密
簡(jiǎn)單示例
/** * 加密字符串并返回base64編碼字符串 * * @param string 要加密的字符串 * @param keyString 加密密鑰 * @param iv 初始化向量(8個(gè)字節(jié)) * * @return 返回加密后的base64編碼字符串 */- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;/** * 解密字符串 * * @param string 加密并base64編碼后的字符串 * @param keyString 解密密鑰 * @param iv 初始化向量(8個(gè)字節(jié)) * * @return 返回解密后的字符串 */- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;// 調(diào)用EncryptionTools *encrypt = [EncryptionTools sharedEncryptionTools];NSLog(@"%@",[encrypt encryptString:@"LN123" keyString:@"LN" iv:nil]);NSLog(@"%@",[encrypt decryptString:@"OPcTMDB5paivqtYo9Fj+hQ==" keyString:@"LN" iv:nil]);
非對(duì)稱加密RSA
- 非對(duì)稱加密的特點(diǎn)
- 使用 公鑰 加密,使用 私鑰 解密
- 使用 私鑰 加密,使用 公鑰 解密(私鑰簽名,公鑰驗(yàn)簽)
- 公鑰是公開的,私鑰保密
- 加密處理安全,但是性能極差
- 經(jīng)典算法-->RSA
簡(jiǎn)單示例
// 公鑰加密時(shí)調(diào)用類方法:+ (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey;+ (NSData *)encryptData:(NSData *)data publicKey:(NSString *)pubKey;// 私鑰解密時(shí)調(diào)用類方法+ (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey;+ (NSData *)decryptData:(NSData *)data privateKey:(NSString *)privacy; /** 調(diào)用 */NSString *str = [RSAUtil encryptString: @"LN" publicKey:RSA_Public_key];NSLog(@"RSA公鑰加密數(shù)據(jù)-->\n%@",str); NSString *str1 = [RSAUtil decryptString:str privateKey:RSA_Privite_key];NSLog(@"RSA私鑰解密數(shù)據(jù)-->%@",str1);
MAC上生成公鑰、私鑰的方法,及使用
# MAC上生成公鑰、私鑰的方法 @code 1.打開終端,切換到自己想輸出的文件夾下 2.輸入指令:openssl(openssl是生成各種秘鑰的工具,mac已經(jīng)嵌入) 3.輸入指令:genrsa -out rsa_private_key.pem 1024 (生成私鑰,java端使用的) 4.輸入指令:rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout (生成公鑰) 5.輸入指令:pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt(私鑰轉(zhuǎn)格式,在ios端使用私鑰解密時(shí)用這個(gè)私鑰) 注意:在MAC上生成三個(gè).pem格式的文件,一個(gè)公鑰,兩個(gè)私鑰,都可以在終端通過指令vim xxx.pem 打開,里面是字符串,第三步生成的私鑰是java端用來解密數(shù)據(jù)的,第五步轉(zhuǎn)換格式的私鑰iOS端可以用來調(diào)試公鑰、私鑰解密(因?yàn)樗借€不留在客戶端) iOS端公鑰加密私鑰解密、java端公鑰加密私鑰解密,java端私鑰加密公鑰解密都容易做到,iOS不能私鑰加密公鑰解密,只能用于驗(yàn)簽 @endcode
5.HTTPS基本使用
-
https簡(jiǎn)單說明
- HTTPS(
全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版。 - 在HTTP下加入
SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。 它是一個(gè)URI scheme(抽象標(biāo)識(shí)符體系),句法類同http:體系。用于安全的HTTP數(shù)據(jù)傳輸。 - HTTPS:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默認(rèn)端口及一個(gè)加密/身份驗(yàn)證層(在HTTP與TCP之間)。
- HTTPS(
-
注意
- HTTPS的主要思想是在不安全的網(wǎng)絡(luò)上創(chuàng)建一安全信道,并可在使用適當(dāng)?shù)募用馨头?wù)器證書可被驗(yàn)證且可被信任時(shí),對(duì)竊聽和中間人攻擊提供合理的保護(hù)。
- HTTPS的信任繼承基于預(yù)先安裝在瀏覽器中的證書頒發(fā)機(jī)構(gòu)(如VeriSign、Microsoft等)(意即“我信任證書頒發(fā)機(jī)構(gòu)告訴我應(yīng)該信任的”)。
- 因此,一個(gè)到某網(wǎng)站的HTTPS連接可被信任,如果服務(wù)器搭建自己的https 也就是說采用自認(rèn)證的方式來建立https信道,這樣一般在客戶端是不被信任的。
- 所以我們一般在瀏覽器訪問一些https站點(diǎn)的時(shí)候會(huì)有一個(gè)提示,問你是否繼續(xù)。
-
HTTPS和HTTP區(qū)別
- https協(xié)議需要到
ca申請(qǐng)證書,一般免費(fèi)證書很少,需要交費(fèi)。 - http是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的
ssl加密傳輸協(xié)議。 - http和https使用的是完全不同的連接方式,用的端口也不一樣,
前者是80,后者是443。 - http的連接很簡(jiǎn)單,是無狀態(tài)的;HTTPS協(xié)議是由
SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。
- https協(xié)議需要到
實(shí)現(xiàn)代碼
方案一:如果是自己使用NSURLSession來封裝網(wǎng)絡(luò)請(qǐng)求
// 1.創(chuàng)建sessionNSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];// 2.創(chuàng)建TaskNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://kyfw.12306.cn/otn"]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 3.解析數(shù)據(jù) NSLog(@"%@---%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],error);}];// 4.執(zhí)行task[dataTask resume]; #pragma mark - 遵守<NSURLSessionDataDelegate>// 如果發(fā)送的請(qǐng)求是https的,那么才會(huì)調(diào)用該方法-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler { /** 判斷服務(wù)器傳給我們的信任的類型,只有是【服務(wù)器信任的時(shí)候,才安裝證書】 NSURLSessionAuthChallengeDisposition 如何處理證書 NSURLAuthenticationMethodServerTrust 服務(wù)器信任 */ if(![challenge.protectionSpace.authenticationMethod isEqualToString:@"NSURLAuthenticationMethodServerTrust"]) { return; } NSLog(@"%@",challenge.protectionSpace); /* NSURLCredential 授權(quán)信息 NSURLSessionAuthChallengeUseCredential = 0, 使用該證書 安裝該證書 NSURLSessionAuthChallengePerformDefaultHandling = 1, 默認(rèn)采用的方式,該證書被忽略 NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2, 取消請(qǐng)求,證書忽略 NSURLSessionAuthChallengeRejectProtectionSpace = 3, 拒絕 */ NSURLCredential *credential = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential,credential); // 注意:并不是所有的https的請(qǐng)求都需要安裝證書(授權(quán))的,請(qǐng)求一些大型的網(wǎng)站有的是強(qiáng)制安裝的,如:蘋果官網(wǎng)https://www.apple.com}
方案二:如果使用AFN網(wǎng)絡(luò)請(qǐng)求
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 更改解析方式(請(qǐng)求網(wǎng)頁(yè)源碼應(yīng)使用原始解析)manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 設(shè)置對(duì)證書的處理方式// 允許自簽名證書,必須的manager.securityPolicy.allowInvalidCertificates = YES;// 是否驗(yàn)證域名的CN字段(不是必須的,但是如果寫YES,則必須導(dǎo)入證書)manager.securityPolicy.validatesDomainName = NO; [manager GET:@"https://kyfw.12306.cn/otn" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"success---%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"error---%@",error);}];
-
補(bǔ)充
ATS(全稱:App Transport Security)iOS9中新增App Transport Security(簡(jiǎn)稱ATS)特性, 讓原來請(qǐng)求時(shí)候用到的HTTP,全部都轉(zhuǎn)向TLS1.2協(xié)議進(jìn)行傳輸。
這意味著所有的HTTP協(xié)議都強(qiáng)制使用了HTTPS協(xié)議進(jìn)行傳輸。
如果我們?cè)趇OS9下直接進(jìn)行HTTP請(qǐng)求是會(huì)報(bào)錯(cuò)。系統(tǒng)會(huì)告訴我們不能直接使用HTTP進(jìn)行請(qǐng)求,需要在Info.plist中控制ATS的配置。
"NSAppTransportSecurity"是ATS配置的根節(jié)點(diǎn),配置了節(jié)點(diǎn)表示告訴系統(tǒng)要走自定義的ATS設(shè)置。
"NSAllowsAritraryLoads"節(jié)點(diǎn)控制是否禁用ATS特性,設(shè)置YES就是禁用ATS功能;
-
采用解決方法,修改配置信息。
image
6.數(shù)據(jù)安全--加密解密效果
學(xué)習(xí)本文之外可以參考
網(wǎng)絡(luò)安全——數(shù)據(jù)的加密與簽名,RSA介紹
關(guān)于Https安全性問題、雙向驗(yàn)證防止中間人攻擊問題
寫在最后,
曾經(jīng)的曾經(jīng),
明天的你,一定會(huì)感謝今天拼命努力的自己!
附上一張圖:
時(shí)間有限,在這里還有好多地方 實(shí)戰(zhàn)應(yīng)用,沒有總結(jié)寫上,后續(xù)再做補(bǔ)充吧~
附上寫的小樣(Demo)
方法可直接拿走使用,如果你喜歡或有幫助,可否給個(gè) Star
后續(xù)
學(xué)習(xí)總結(jié)-->GitHub(現(xiàn)在代碼少點(diǎn),總結(jié)好 待上傳)、白開水ln-簡(jiǎn)書
不定時(shí)、持續(xù)更新、一些 學(xué)習(xí)心得與文章、實(shí)戰(zhàn)應(yīng)用~
我也是對(duì)所花費(fèi)時(shí)間的一個(gè)總結(jié),「學(xué)習(xí)總結(jié),一勞永逸」。有不足或不對(duì)之處,樂聽你的槽點(diǎn)(和??) ~ 關(guān)注菜鳥成長(zhǎng)(簡(jiǎn)書專題)_. 我會(huì)不定時(shí)更新一些學(xué)習(xí)心得與文章;