iOS數(shù)據(jù)安全—加密解密「學(xué)習(xí)總結(jié)」

轉(zhuǎn)載 https://blog.csdn.net/qq_30513483/article/details/60143441

寫在前面
在寫項目中,數(shù)據(jù)的安全性至關(guān)重要嚼松,而僅僅用 POST 請求提交用戶的隱私數(shù)據(jù),還是不能完全解決安全問題徘钥。因此:我們經(jīng)常會用到加密技術(shù)蝎困,比如說在登錄的時候,我們會先把密碼用MD5加密再傳輸給服務(wù)器 或者 直接對所有的參數(shù)進(jìn)行加密再POST到服務(wù)器魂迄。
記得最初接觸加密,也不懂惋耙,就根據(jù)文檔捣炬,用的是 md5,直接調(diào)一方法就OK 了(感覺加密也簡單的)-->淡淡的一笑绽榛!

相信很多開發(fā)者跟我當(dāng)初一樣湿酸,只是根據(jù)項目經(jīng)理或者文檔指示進(jìn)行加密,簡單會使用 但并不知道加密知識體系和內(nèi)在原理灭美,于是整理了一份相關(guān)資料推溃。時間有限,知識并未全覆蓋届腐,有遺漏或者錯誤铁坎,忘指正蜂奸。

image

目錄:

  1. 數(shù)據(jù)安全介紹
  2. 常用加密算法
  3. 常用加密方式
  4. Base64編碼方案
  5. 加密實現(xiàn)代碼
    5.1 MD5加密算法
    5.2 對稱加密算法AES和DES
    5.3 非對稱加密RSA
  6. HTTPS基本使用
  7. 數(shù)據(jù)安全–加密解密效果
  8. 加密實戰(zhàn)應(yīng)用場景(持續(xù)更新)
1.數(shù)據(jù)安全介紹
  • 最基礎(chǔ)的是我們發(fā)送網(wǎng)絡(luò)請求時,使用getpost方式發(fā)送請求硬萍。兩者具體區(qū)別就不做解釋了扩所,只是引出相關(guān)安全性問題

    • get:將參數(shù)暴露在外,(絕對不安全-->明文請求或者傻瓜式請求)朴乖。
    • post:將參數(shù)放到請求體body中祖屏,(相對于get比較安全-->但是我們可以很容易用一些軟件截獲請求數(shù)據(jù)。比如說Charles(青花瓷)
  • Charles(大部分app的數(shù)據(jù)來源都使用該工具來抓包买羞,并做網(wǎng)絡(luò)測試)

    • 注意:Charles在使用中的亂碼問題赐劣,可以顯示包內(nèi)容,然后打開info.plist文件哩都,找到j(luò)ava目錄下面的VMOptions魁兼,在后面添加一項:-Dfile.encoding=UTF-8
    • 這里提供一個青花瓷破解版下載途徑,供大家學(xué)習(xí)使用漠嵌,商務(wù)需求咐汞,也請支持正版
  • 數(shù)據(jù)安全的原則

    • 在網(wǎng)絡(luò)上不允許傳輸用戶隱私數(shù)據(jù)的明文,(即:App網(wǎng)絡(luò)傳輸安全儒鹿,指對數(shù)據(jù)從客戶端傳輸?shù)絊erver中間過程的加密化撕,防止網(wǎng)絡(luò)世界當(dāng)中其他節(jié)點對數(shù)據(jù)的竊聽)。
    • 在本地不允許保存用戶隱私數(shù)據(jù)的明文,(即:App數(shù)據(jù)存儲安全约炎,主要指在磁盤做數(shù)據(jù)持久化的時候所做的加密)植阴。
    • App代碼安全,(即:包括代碼混淆,加密或者app加殼)圾浅。
  • 要想非常安全的傳輸數(shù)據(jù)掠手,建議使用https。抓包不可以狸捕,但是中間人攻擊則有可能喷鸽。建議雙向驗證防止中間人攻擊,可以參考下文篇章灸拍。

2.常用加密算法
常用加密算法 名稱
編碼方案 Base64
哈希(散列)函數(shù) MD5(消息摘要算法)
SHA1
SHA256
對稱加密算法 DES
AES
非對稱加密算法 RSA
HTTPS HTTP+SSL協(xié)議
3.常用加密方式
常用加密方式
1.通過簡單 BASE64編碼 防止數(shù)據(jù)明文傳輸
2.對普通請求做祝、返回數(shù)據(jù),生成MD5校驗(MD5中加入動態(tài)密鑰)鸡岗,進(jìn)行數(shù)據(jù)完整性(簡單防篡改混槐,安全性較低,優(yōu)點:快速)校驗
3.對于重要數(shù)據(jù)轩性,使用RSA進(jìn)行數(shù)字簽名声登,起到防篡改作
4.對于比較敏感的數(shù)據(jù),如用戶信息(登陸、注冊等)捌刮,客戶端發(fā)送使用RSA加密,服務(wù)器返回使用DES(AES)加密
5.要想非常安全的傳輸數(shù)據(jù)舒岸,建議使用https绅作。抓包不可以,但是中間人攻擊則有可能蛾派。建議雙向驗證防止中間人攻擊
4.Base64編碼方案
  1. Base64簡單說明
    描述:Base64可以成為密碼學(xué)的基石俄认,非常重要。
    特點:可以將任意的二進(jìn)制數(shù)據(jù)進(jìn)行Base64編碼
    結(jié)果:所有的數(shù)據(jù)都能被編碼為并只用65個字符(A~Z a~z 0~9 + / =)就能表示的文本文件洪乍。
    注意:對文件進(jìn)行base64編碼后文件數(shù)據(jù)的變化:編碼后的數(shù)據(jù)~=編碼前數(shù)據(jù)的4/3眯杏,會大1/3左右。

  2. Base64編碼原理和處理過程

Base64編碼原理
1壳澳、將所有字符轉(zhuǎn)化為ASCII碼
2岂贩、將ASCII碼轉(zhuǎn)化為8位二進(jìn)制
3、將二進(jìn)制3個歸成一組(不足3個在后邊補(bǔ)0)共24位巷波,再拆分成4組萎津,每組6位
4、統(tǒng)一在6位二進(jìn)制前補(bǔ)兩個0湊足8位
5抹镊、將補(bǔ)0后的二進(jìn)制轉(zhuǎn)為十進(jìn)制
6锉屈、從Base64編碼表獲取十進(jìn)制對應(yīng)的Base64編碼
Base64處理過程
1、轉(zhuǎn)換的時候垮耳,將三個byte的數(shù)據(jù)颈渊,先后放入一個24bit的緩沖區(qū)中,先來的byte占高位终佛。
2俊嗽、數(shù)據(jù)不足3byte的話,于緩沖區(qū)中剩下的bit用0補(bǔ)足铃彰。然后乌询,每次取出6個bit,按照其值選擇查表選擇對應(yīng)的字符作為編碼后的輸出豌研。
3妹田、不斷進(jìn)行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成鹃共。
4鬼佣、如果最后剩下兩個輸入數(shù)據(jù),在編碼結(jié)果后加1個“=”霜浴;
5晶衷、如果最后剩下一個輸入數(shù)據(jù),編碼結(jié)果后加2個“=”;
6晌纫、如果沒有剩下任何數(shù)據(jù)税迷,就什么都不要加,這樣才可以保證資料還原的正確性锹漱。

在這里提供幾張圖結(jié)合上面的處理過程箭养,好理解。

image
  1. Base64實現(xiàn)代碼

簡單方法直接拿走哥牍,調(diào)用

// 對一個字符串進(jìn)行base64編碼,并且返回-(NSString *)base64EncodeString:(NSString *)string {    // 1.先轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];    // 2.對二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼,完成之后返回字符串    return [data base64EncodedStringWithOptions:0];} // 對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.加密實現(xiàn)代碼

哈希(散列)函數(shù)
特點:

  • 算法是公開的
  • 對相同的數(shù)據(jù)加密毕泌,得到的結(jié)果是一樣的"
  • 對不同的數(shù)據(jù)加密,得到的結(jié)果是定長的嗅辣,MD5對不同的數(shù)據(jù)進(jìn)行加密撼泛,得到的結(jié)果都是 32 個字符長度的字符串
  • 信息摘要,信息"指紋"澡谭,是用來做數(shù)據(jù)識別的愿题!
  • 不能逆推反算(重要)

用途:

  • 版權(quán) 對文件進(jìn)行散列判斷該文件是否是正版或原版的
  • 文件完整性驗證 對整個文件進(jìn)行散列,比較散列值判斷文件是否完整或被篡改
  • 密碼加密蛙奖,服務(wù)器并不需要知道用戶真實的密碼抠忘!
  • 搜索:
    如:百度搜索-->老司機(jī) 皮皮蝦 蒼老師
    或是 【蒼老師 老司機(jī) 皮皮蝦 】
    上面兩種方式搜索出來的內(nèi)容是一樣的
    • 如何判斷:對搜索的每個關(guān)鍵字進(jìn)行三列,得到三個相對應(yīng)的結(jié)果外永,按位相加結(jié)果如果是一樣的崎脉,那搜索的內(nèi)容就是一樣的!
  • 經(jīng)典加密算法:MD5伯顶、SHA1囚灼、SHA512
MD5消息摘要算法
  • 簡單介紹:

    • MD5:全稱是Message Digest Algorithm 5,譯為“消息摘要算法第5版”(經(jīng)MD2祭衩、MD3和MD4發(fā)展而來)
    • 效果:對輸入信息生成唯一的128位散列值(32個字符)灶体,即 32個16進(jìn)制的數(shù)字。
  • 特點:

    • 輸入兩個不同的明文不會得到相同的輸出值
    • 根據(jù)輸出值掐暮,不能得到原始的明文蝎抽,即其過程不可逆(只能加密, 不能解密)
  • 應(yīng)用:

    • 現(xiàn)在的MD5已不再是絕對安全(如:暴力破解的網(wǎng)站),對此路克,可以對MD5稍作改進(jìn)樟结,以增加解密的難度。
    • 解決:加鹽(Salt):在明文的固定位置插入隨機(jī)串精算,然后再進(jìn)行MD5(先加密瓢宦,后亂序:先對明文進(jìn)行MD5,然后對加密得到的MD5串的字符進(jìn)行亂序)
  • 注意點:

    • 開發(fā)中灰羽,一定要和后臺開發(fā)人員約定好驮履,MD5加密的位數(shù)是16位還是32位(大多數(shù)都是32位的)鱼辙,16位的可以通過32位的轉(zhuǎn)換得到。
    • MD5加密區(qū)分 大小寫玫镐,使用時要和后臺約定好倒戏。
    • MD5公認(rèn)被破解不代表其可逆,而是一段字符串加密后的密文恐似,可以通過強(qiáng)大運(yùn)算計算出字符串加密后的密文對應(yīng)的原始字符串杜跷,但也不是絕對的被破解。
  • PS.暴力破解是指通過將明文和生成的密文進(jìn)行配對蹂喻,生成強(qiáng)大的數(shù)據(jù)庫,在數(shù)據(jù)庫中搜索捂寿,在這里就可以破解密碼口四。破解網(wǎng)址 http://www.cmd5.com

提升MD5加密安全性,解決辦法

  • 1.先明文加鹽秦陋,然后再進(jìn)行MD5蔓彩。即明文后拼接字符串(此時拼接的字符串要 足夠長+足夠咸+足夠復(fù)雜),再進(jìn)行MD5加密驳概。如:#define salt @"1342*&%&shlfhs390(*^^6R%@@KFGKF"

  • 2.先加密+亂序

  • 3.亂序|加鹽赤嚼,多次MD5加密等

  • 4.使用消息認(rèn)證機(jī)制HMAC:給定一個"秘鑰",對明文進(jìn)行加密顺又,并且做"兩次散列"更卒!-> 得到的結(jié)果,還是 32 個字符稚照,相對安全(KEY是服務(wù)器傳給你的蹂空,不是你寫死的)。

消息認(rèn)證機(jī)制(HMAC)簡單說明

  • 原理
    • 消息的發(fā)送者和接收者有一個共享密鑰
    • 發(fā)送者使用共享密鑰對消息加密計算得到MAC值(消息認(rèn)證碼)
    • 消息接收者使用共享密鑰對消息加密計算得到MAC值
    • 比較兩個MAC值是否一致
  • 使用
    • 客戶端需要在發(fā)送的時候把(消息)+(消息·HMAC)一起發(fā)送給服務(wù)器
    • 服務(wù)器接收到數(shù)據(jù)后果录,對拿到的消息用共享的KEY進(jìn)行HMAC上枕,比較是否一致,如果一致則信任

簡單示例

#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ù)組長度 *  @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"]);
對稱加密算法AES和DES
  • 對稱加密的特點
    • 加密/解密使用相同的密鑰
    • 加密和解密的過程是可逆的
  • 經(jīng)典算法
    • DES 數(shù)據(jù)加密標(biāo)準(zhǔn)
    • AES 高級加密標(biāo)準(zhǔn)
  • 提示:
    • 加密過程是先加密弱恒,再base64編碼
    • 解密過程是先base64解碼辨萍,再解密

簡單示例

/** *  加密字符串并返回base64編碼字符串 * *  @param string    要加密的字符串 *  @param keyString 加密密鑰 *  @param iv        初始化向量(8個字節(jié)) * *  @return 返回加密后的base64編碼字符串 */- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;/** *  解密字符串 * *  @param string    加密并base64編碼后的字符串 *  @param keyString 解密密鑰 *  @param iv        初始化向量(8個字節(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]);
非對稱加密RSA
  • 非對稱加密的特點
    • 使用 公鑰 加密,使用 私鑰 解密
    • 使用 私鑰 加密返弹,使用 公鑰 解密(私鑰簽名锈玉,公鑰驗簽)
    • 公鑰是公開的,私鑰保密
    • 加密處理安全义起,但是性能極差
  • 經(jīng)典算法-->RSA

簡單示例

// 公鑰加密時調(diào)用類方法:+ (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey;+ (NSData *)encryptData:(NSData *)data publicKey:(NSString *)pubKey;// 私鑰解密時調(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端使用私鑰解密時用這個私鑰) 注意:在MAC上生成三個.pem格式的文件昼汗,一個公鑰,兩個私鑰鬼雀,都可以在終端通過指令vim xxx.pem 打開顷窒,里面是字符串,第三步生成的私鑰是java端用來解密數(shù)據(jù)的源哩,第五步轉(zhuǎn)換格式的私鑰iOS端可以用來調(diào)試公鑰鞋吉、私鑰解密(因為私鑰不留在客戶端) iOS端公鑰加密私鑰解密、java端公鑰加密私鑰解密励烦,java端私鑰加密公鑰解密都容易做到谓着,iOS不能私鑰加密公鑰解密,只能用于驗簽 @endcode
5.HTTPS基本使用
  • https簡單說明

    • HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer)坛掠,是以安全為目標(biāo)的HTTP通道赊锚,簡單講是HTTP的安全版。
    • 在HTTP下加入SSL層屉栓,HTTPS的安全基礎(chǔ)是SSL舷蒲,因此加密的詳細(xì)內(nèi)容就需要SSL。 它是一個URI scheme(抽象標(biāo)識符體系)友多,句法類同http:體系牲平。用于安全的HTTP數(shù)據(jù)傳輸。
    • HTTPS:URL表明它使用了HTTP域滥,但HTTPS存在不同于HTTP的默認(rèn)端口及一個加密/身份驗證層(在HTTP與TCP之間)欠拾。
  • 注意

    • HTTPS的主要思想是在不安全的網(wǎng)絡(luò)上創(chuàng)建一安全信道,并可在使用適當(dāng)?shù)募用馨头?wù)器證書可被驗證且可被信任時骗绕,對竊聽和中間人攻擊提供合理的保護(hù)藐窄。
    • HTTPS的信任繼承基于預(yù)先安裝在瀏覽器中的證書頒發(fā)機(jī)構(gòu)(如VeriSign、Microsoft等)(意即“我信任證書頒發(fā)機(jī)構(gòu)告訴我應(yīng)該信任的”)酬土。
    • 因此荆忍,一個到某網(wǎng)站的HTTPS連接可被信任,如果服務(wù)器搭建自己的https 也就是說采用自認(rèn)證的方式來建立https信道撤缴,這樣一般在客戶端是不被信任的刹枉。
    • 所以我們一般在瀏覽器訪問一些https站點的時候會有一個提示,問你是否繼續(xù)屈呕。
  • HTTPS和HTTP區(qū)別

    • https協(xié)議需要到ca申請證書微宝,一般免費(fèi)證書很少,需要交費(fèi)虎眨。
    • http是超文本傳輸協(xié)議蟋软,信息是明文傳輸镶摘,https 則是具有安全性的ssl加密傳輸協(xié)議
    • http和https使用的是完全不同的連接方式岳守,用的端口也不一樣凄敢,前者是80后者是443湿痢。
    • http的連接很簡單涝缝,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸譬重、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議拒逮,比http協(xié)議安全。
  • 實現(xiàn)代碼

方案一:如果是自己使用NSURLSession來封裝網(wǎng)絡(luò)請求

// 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ā)送的請求是https的,那么才會調(diào)用該方法-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler {    /**     判斷服務(wù)器傳給我們的信任的類型臀规,只有是【服務(wù)器信任的時候滩援,才安裝證書】     NSURLSessionAuthChallengeDisposition 如何處理證書     NSURLAuthenticationMethodServerTrust 服務(wù)器信任     */    if(![challenge.protectionSpace.authenticationMethod isEqualToString:@"NSURLAuthenticationMethodServerTrust"]) {        return;    }    NSLog(@"%@",challenge.protectionSpace);    /*     NSURLCredential 授權(quán)信息     NSURLSessionAuthChallengeUseCredential = 0, 使用該證書 安裝該證書     NSURLSessionAuthChallengePerformDefaultHandling = 1, 默認(rèn)采用的方式,該證書被忽略     NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2, 取消請求,證書忽略     NSURLSessionAuthChallengeRejectProtectionSpace = 3,          拒絕     */    NSURLCredential *credential = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];    completionHandler(NSURLSessionAuthChallengeUseCredential,credential);    // 注意:并不是所有的https的請求都需要安裝證書(授權(quán))的,請求一些大型的網(wǎng)站有的是強(qiáng)制安裝的以现,如:蘋果官網(wǎng)https://www.apple.com}

方案二:如果使用AFN網(wǎng)絡(luò)請求

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 更改解析方式(請求網(wǎng)頁源碼應(yīng)使用原始解析)manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 設(shè)置對證書的處理方式// 允許自簽名證書狠怨,必須的manager.securityPolicy.allowInvalidCertificates = YES;// 是否驗證域名的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(簡稱ATS)特性, 讓原來請求時候用到的HTTP,全部都轉(zhuǎn)向TLS1.2協(xié)議進(jìn)行傳輸恰矩。

    • 這意味著所有的HTTP協(xié)議都強(qiáng)制使用了HTTPS協(xié)議進(jìn)行傳輸记盒。

    • 如果我們在iOS9下直接進(jìn)行HTTP請求是會報錯。系統(tǒng)會告訴我們不能直接使用HTTP進(jìn)行請求外傅,需要在Info.plist中控制ATS的配置纪吮。

    • "NSAppTransportSecurity"是ATS配置的根節(jié)點,配置了節(jié)點表示告訴系統(tǒng)要走自定義的ATS設(shè)置萎胰。

    • "NSAllowsAritraryLoads"節(jié)點控制是否禁用ATS特性碾盟,設(shè)置YES就是禁用ATS功能;

    • 采用解決方法,修改配置信息技竟。

      image
6.數(shù)據(jù)安全--加密解密效果
image

學(xué)習(xí)本文之外可以參考
網(wǎng)絡(luò)安全——數(shù)據(jù)的加密與簽名,RSA介紹
關(guān)于Https安全性問題冰肴、雙向驗證防止中間人攻擊問題


寫在最后,
曾經(jīng)的曾經(jīng)榔组,
明天的你,一定會感謝今天拼命努力的自己熙尉!
附上一張圖:

image
image

時間有限,在這里還有好多地方 實戰(zhàn)應(yīng)用搓扯,沒有總結(jié)寫上检痰,后續(xù)再做補(bǔ)充吧~
附上寫的小樣(Demo)
方法可直接拿走使用,如果你喜歡或有幫助锨推,可否給個 Star

后續(xù)
學(xué)習(xí)總結(jié)-->GitHub(現(xiàn)在代碼少點铅歼,總結(jié)好 待上傳)公壤、白開水ln-簡書
不定時、持續(xù)更新谭贪、一些 學(xué)習(xí)心得與文章境钟、實戰(zhàn)應(yīng)用~


我也是對所花費(fèi)時間的一個總結(jié),「學(xué)習(xí)總結(jié),一勞永逸」俭识。有不足或不對之處慨削,樂聽你的槽點(和??) ~ 關(guān)注菜鳥成長(簡書專題)_. 我會不定時更新一些學(xué)習(xí)心得與文章;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末套媚,一起剝皮案震驚了整個濱河市缚态,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堤瘤,老刑警劉巖玫芦,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異本辐,居然都是意外死亡桥帆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門慎皱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來老虫,“玉大人,你說我怎么就攤上這事茫多∑沓祝” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵天揖,是天一觀的道長夺欲。 經(jīng)常有香客問我,道長今膊,這世上最難降的妖魔是什么些阅? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮斑唬,結(jié)果婚禮上市埋,老公的妹妹穿的比我還像新娘。我一直安慰自己赖钞,他們只是感情好腰素,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雪营,像睡著了一般弓千。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上献起,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天洋访,我揣著相機(jī)與錄音镣陕,去河邊找鬼。 笑死姻政,一個胖子當(dāng)著我的面吹牛呆抑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汁展,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼鹊碍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了食绿?” 一聲冷哼從身側(cè)響起侈咕,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎器紧,沒想到半個月后耀销,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铲汪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年熊尉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掌腰。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡狰住,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辅斟,到底是詐尸還是另有隱情转晰,我是刑警寧澤芦拿,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布士飒,位于F島的核電站,受9級特大地震影響蔗崎,放射性物質(zhì)發(fā)生泄漏酵幕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一缓苛、第九天 我趴在偏房一處隱蔽的房頂上張望芳撒。 院中可真熱鬧,春花似錦未桥、人聲如沸笔刹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舌菜。三九已至,卻和暖如春亦镶,著一層夾襖步出監(jiān)牢的瞬間日月,已是汗流浹背袱瓮。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留爱咬,地道東北人尺借。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像精拟,于是被迫代替她去往敵國和親燎斩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容