【資料整理】
iOS 中的網絡加密
公司的接口一般會兩種協議的,一種HTTP,一種HTTPS的,HTTP 只要請求,服務器就會響應,如果我們不對請求和響應做出加密處理,所有信息都是會被檢測劫持到的,是很不安全的,客戶端加密可以使用我這套工具類進行處理:文章地址
但是不論在任何時候,都應該將服務置于HTTPS上,因為它可以避免中間人攻擊的問題,還自帶了基于非對稱密鑰的加密通道!使用HTTPS后,可以省去各種加解密技術。
介紹下HTTPS交互原理
簡答說,HTTPS 就是 HTTP協議加了一層SSL協議的加密處理,SSL 證書就是遵守 SSL協議,由受信任的數字證書頒發機構CA(如GlobalSign,wosign),在驗證服務器身份后頒發,這是需要花錢滴,簽發后的證書作為公鑰一般放在服務器的根目錄下,便于客戶端請求返回給客戶端,私鑰在服務器的內部中心保存,用于解密公鑰。
HTTPS 客戶端與服務器交互過程:
1、客戶端發送請求,服務器返回公鑰給客戶端;
2、客戶端生成對稱加密秘鑰,用公鑰對其進行加密后,返回給服務器;
3、服務器收到后,利用私鑰解開得到對稱加密秘鑰,保存;
4、之后的交互都使用對稱加密后的數據進行交互。
參考資料:https://www.cnblogs.com/fengmin/p/8178217.html(包含AFN對不信任證書的相關處理)
1 前言:
在提交用戶的隱私數據,例如:登錄密碼、銀行賬號等,不能用明文進行傳輸,很容易被截獲。????
? ? ? ? 1. get請求的所有參數都直接暴露在URL中,可直接看到
????????2. post請求可以利用軟件(如Charles)攔截查看手機的請求數據,使用教程參考Charles抓包
因此:在提交用戶的隱私數據時,一定不要明文提交,要先加密處理后再進行提交。
2 常見加密算法
常用加密算法 ? ? ? ? ? ? ? ? ? ? ?名稱
編碼方式 ? ? ? ? ? ? ? ? ? ? ? ? ? ?Base64 ?Base58
哈希(散列)函數 ? ? ? ? ? ? ? ? MD5(消息摘要算法) ?SHA1 ?SHA256 ?SHA512
對稱加密算法 ? ? ? ? ? ? ? ? ? ?DES ? AES
非對稱加密算法 ? ? ? ? ? ? ? ?RSA(公鑰、私鑰)?ECC
對稱加密可分為:
?????????流加密? 對信息流中每一個元素加密,如12345678, 先對1加密,在對2加密
? ? ? ? ?塊加密? 先對信息分塊。然后對塊加密,如12345678,先1234成塊,5678成塊,然后對塊加密。
2.1 Base64/Base58編碼
? ? ? ? ? ? ? ? 不是加密算法。只是一種編碼方式。通過簡單 BASE64編碼 防止數據明文傳輸
? ? ? ? ? ? ? ? ?Base64是有64個字符組成,大寫A-Z 、小寫a-z,數字0-9,兩個字符 + 和 =
? ??????????????Base58中沒有字母o,沒有數字0,沒有大小寫字母I i,也沒有字符 + ?=.(一般用在比特幣里面的一種編碼方式)
Base64編碼原理和處理過程
Base64編碼原理
?????????????1、將所有字符轉化為ASCII碼
?????????????2、將ASCII碼轉化為8位二進制
?????????????3、將二進制3個歸成一組(不足3個在后邊補0)共24位,再拆分成4組,每組6位
?????????????4、統一在6位二進制前補兩個0湊足8位
?????????????5、將補0后的二進制轉為十進制
?????????????6、從Base64編碼表獲取十進制對應的Base64編碼
Base64處理過程
?????????????1、轉換的時候,將三個byte的數據,先后放入一個24bit的緩沖區中,先來的byte占高位。
?????????????2、數據不足3byte的話,于緩沖區中剩下的bit用0補足。然后,每次取出6個bit,按照其值選擇查表選擇對應的字符作為編碼后的輸出。
?????????????3、不斷進行,直到全部輸入數據轉換完成。
?????????????4、如果最后剩下兩個輸入數據,在編碼結果后加1個“=”;
?????????????5、如果最后剩下一個輸入數據,編碼結果后加2個“=”;
?????????????6、如果沒有剩下任何數據,就什么都不要加,這樣才可以保證資料還原的正確性。????
? 示例:注意 “ ? = ?” 比較特殊。因為base64是三個字節為一組,如果位數不夠時,會使用“=”進行補齊,對文件進行base64編碼后文件數據的變化:編碼后的數據約等于編碼前數據的4/3,會大1/3左右。
? ? ? ? 2.2?哈希(散列)函數 ? ?
哈希(散列)函數
特點:
????算法是公開的
????對相同的數據加密,得到的結果是一樣的"
????對不同的數據加密,得到的結果是定長的,MD5對不同的數據進行加密,得到的結果都是 32 個字符長度的字符串
????信息摘要,信息"指紋",是用來做數據識別的!
????不能逆推反算(重要)
用途:
????版權 對文件進行散列判斷該文件是否是正版或原版的
????文件完整性驗證 對整個文件進行散列,比較散列值判斷文件是否完整或被篡改
????密碼加密,服務器并不需要知道用戶真實的密碼!
? ? ? ? ? ? ? ??MD5消息摘要算法
? ? ? ? ? ? ? ? MD5:全稱是Message Digest Algorithm 5,譯為“消息摘要算法第5版”(經MD2、MD3和MD4發展而來)
? ? ? ? ? ? ? ? 效果:對輸入信息生成唯一的128位散列值(32個字符),即 32個16進制的數字。
? ? ? ? ? ? ·特點:
? ? ? ? ? ? ? ? 輸入兩個不同的明文不會得到相同的輸出值
? ? ? ? ? ? ? ? 根據輸出值,不能得到原始的明文,即其過程不可逆(只能加密, 不能解密)
? ? ? ? ? ? ·應用:
? ? ? ? ? ? ? ? 現在的MD5已不再是絕對安全(如:暴力破解的網站),對此,可以對MD5稍作改進,以增加解密的難度。
? ? ? ? ? ? ? ? 解決:加鹽(Salt):在明文的固定位置插入隨機串,然后再進行MD5(先加密,后亂序:先對明文進行MD5,然后對加密得到的MD5串的字符進行亂序)
? ? ? ? ? ? ·注意點:
? ? ? ? ? ? ? ? 開發中,一定要和后臺開發人員約定好,MD5加密的位數是16位還是32位(大多數都是32位的),16位的可以通過32位的轉換得到。
? ? ? ? ? ? ? ? MD5加密區分 大小寫,使用時要和后臺約定好。
? ? ? ? ? ? ? ? MD5公認被破解不代表其可逆,而是一段字符串加密后的密文,可以通過強大運算計算出字符串加密后的密文對應的原始字符串,但也不是絕對的被破解。
? ? ? ? ? ? ? ? PS.暴力破解是指通過將明文和生成的密文進行配對,生成強大的數據庫,在數據庫中搜索,在這里就可以破解密碼。破解網址 http://www.cmd5.com
? ? ? ? ? ? ·提升MD5加密安全性,解決辦法
? ? ? ? ? ? ? ? 1.先明文加鹽,然后再進行MD5。即明文后拼接字符串(此時拼接的字符串要 足夠長+足夠咸+足夠復雜),再進行MD5加密。如:#define salt @"1342*&%&shlfhs390(*^^6R%@@KFGKF"
? ? ? ? ? ? ? ? 2.先加密+亂序
? ? ? ? ? ? ? ? 3.亂序|加鹽,多次MD5加密等
? ? ? ? ? ? ? ? 4.使用消息認證機制HMAC:給定一個"秘鑰",對明文進行加密,并且做"兩次散列"!-> 得到的結果,還是 32 個字符,相對安全(KEY是服務器傳給你的,不是你寫死的)。
? ? ? ? ? ? ? ? ? ? 4.1 消息認證機制(HMAC)原理
? ? ? ? ? ? ? ? ? ? 消息的發送者和接收者有一個共享密鑰,發送者使用共享密鑰對消息加密計算得到MAC值(消息認證碼)。
? ? ? ? ? ? ? ? ? ? 消息接收者使用共享密鑰對消息加密計算得到MAC值,比較兩個MAC值是否一致。
? ? ? ? ? ? ? ? ? ? 4.2 使用:客戶端需要在發送的時候把(消息)+(消息·HMAC)一起發送給服務器;服務器接收到數據后,對拿到的消息用共享的KEY進行HMAC,比較是否一致,如果一致則信任。
2.3對稱加密算法AES和DES
? ? 采用單鑰密碼系統加密方式。同一個密鑰可以同時用作信息的加密和解密。
????對稱加密的特點
? ? ? ? ? ?1. 加密速度快,可加密大文件?
? ? ? ? ? ?2. 密文可逆,加密和解密的過程是可逆的,一旦密鑰泄露,就會導致暴露
? ? ? ? ? ?3. 加密后編碼找不到對應字符,會出現亂碼,一般結合base64?
????經典算法
????????????DES 數據加密標準
????????????AES 高級加密標準(基于DES)
提示:加密過程是先加密,再base64編碼; 解密過程是先base64解碼,再解密 (base64是為了可讀性,不然會出現亂碼)
2.4 非對稱加密RSA
? ? ·非對稱加密的特點
? ? ? ? 使用 公鑰 加密,使用 私鑰 解密
? ? ? ? 使用 私鑰 加密,使用 公鑰 解密(私鑰簽名,公鑰驗簽)
? ? ? ? 公鑰是公開的,私鑰保密
? ? ? ? 加密處理安全,但是性能極差
? ? ·經典算法-->RSA
# MAC上生成公鑰、私鑰的方法?
1.打開終端,切換到自己想輸出的文件夾下
2.輸入指令:openssl(openssl是生成各種秘鑰的工具,mac已經嵌入)
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(私鑰轉格式,在ios端使用私鑰解密時用這個私鑰)
注意:在MAC上生成三個.pem格式的文件,一個公鑰,兩個私鑰,都可以在終端通過指令vim xxx.pem 打開,里面是字符串,第三步生成的私鑰是java端用來解密數據的,第五步轉換格式的私鑰iOS端可以用來調試公鑰、私鑰解密(因為私鑰不留在客戶端)
iOS端公鑰加密私鑰解密、java端公鑰加密私鑰解密,java端私鑰加密公鑰解密都容易做到,iOS不能私鑰加密公鑰解密,只能用于驗簽
參考資料:
App安全https://www.cnblogs.com/fengmin/p/8178217.html
iOS加密詳解http://www.lxweimin.com/p/cee228aabdbc