iOS 網絡傳輸數據安全以及常用的加密算法使用

我們常說的數據安全:主要分爲兩種,數據本身的安全和數據防護安全。

數據本身的安全包括數據保密,數據完整性驗證,數據雙向認證等。

數據防護安全包括磁盤陣列,數據備份,異地容災等。

App安全問題主要包括:
    App代碼安全,包括代碼混淆,加密或者app加殼。
    App數據存儲安全,主要指在磁盤做數據持久化的時候所做的加密。
    App網絡傳輸安全,指對數據從客戶端傳輸到服務器中間過程的加密,防止網絡傳輸過程當中其他節點對數據的篡改。

我在這裏主要想跟大家分享數據在網絡傳輸過程中的安全問題。

數據安全簡介

數據安全的基本概念

      數據安全:是一種主動的包含措施,數據本身的安全必須基於可靠的加密算法與安全體系,主要是有對稱算法與公開密鑰密碼體系兩種(非對稱算法),都包含了數據的加密和解密過程。

      對稱算法:對稱密碼算法有時又叫傳統密碼算法,是指加密密鑰可以從解密密鑰中推算出來,反過來也成立。

非對稱算法:非對稱密鑰也叫公開密鑰加密,就是不能由其中一個密鑰推導出另一個密鑰。 

      密鑰:密鑰是一種參數,它是在明文轉換爲密文或將密文轉換爲明文的算法中輸入的參數。密鑰分爲對稱 密鑰與非對稱密鑰(也可以根據用途來分爲加密密鑰和解密密鑰)。
      明文:沒有進行加密,能夠直接代表原文含義的信息。
      密文:經過加密處理處理之後,隱藏原文含義的信息。
      加密:將明文轉換成密文的實施過程。

      解密:將密文轉換成明文的實施過程。

網絡數據安全傳輸要實現的效果 

    例如數據從A傳輸到B,怎麼纔算安全傳輸。

        1.Message有A的電子簽名,表明消息確實是來自A。
        2.Message沒有被篡改過。
        3.Message被某種加密算法加密過,只有A和B知道如何解密。

數據安全的原則

1.在網絡上不允許傳輸用戶隱私數據的明文。(即:App網絡傳輸安全,指對數據從客戶端傳輸到Server中間過程的加密,防止網絡世界當中其他節點對數據的竊聽)。
2.在本地不允許保存用戶隱私數據的明文。(即:App數據存儲安全,主要指在磁盤做數據持久化的時候所做的加密)。
3.App代碼安全。(即:包括代碼混淆,加密或者app加殼)。

4.要想非常安全的傳輸數據,建議使用https。

5.防止中間人攻擊,建議雙向驗證。 

常用的加密算法
1.編碼方案:指定數據的編碼格式,通過簡單 BASE64編碼防止數據明文傳輸。如 Base64編碼方案。

    Base64可以成爲密碼學的基石,非常重要。它可以將任意的二進制數據進行Base64編碼,並且所有的數據都能被編碼爲並只用65個字符(A~Z a~z 0~9 + / =)就能表示的文本文件。

    注意:對文件進行base64編碼後文件數據的變化:編碼後的數據~=編碼前數據的4/3,會大1/3左右。

    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) 如果沒有剩下任何數據,就什麼都不要加,這樣纔可以保證資料還原的正確性。

2.哈希算法:通過使用安全散列算法,計算出一個數字消息所對應到的長度固定的字符串,進行數據完整性校驗。如:MD2、MD4、MD5(消息摘要算法),SHA1,SHA256 等。

    哈希算法:哈希算法將任意長度的二進制值映射爲較短的固定長度的二進制值,這個小的二進制值稱爲哈希值。

哈希值是一段數據唯一且極其緊湊的數值表示形式。數據的哈希值可以檢驗數據的完整性。一般用於快速查找和加密算法。哈希算法是一種摘要算法,主要作用是用來獲取數據的摘要。嚴格意義上來說不屬於加密算法(因爲沒有解密過程)。

     MD5簡介

    MD5:Message Digest Algorithm MD5(中文名爲消息摘要算法第五版)爲計算機安全領域廣泛使用的一種散列函數,用以提供消息的完整性保護。對輸入信息生成唯一的128位散列值(32個字符),即 32個16進制的數字。(簡單防篡改,安全性較低,優點:快速)。算法是公開的,對相同的數據加密,得到的結果是一樣的;對不同的數據加密,得到的結果是定長的;MD5對不同的數據進行加密,得到的結果都是 32 個字符長度的字符串信息摘要,信息"指紋",是用來做數據識別的,不能逆推反算(重要)。

    MD5算法特點:
        壓縮性:任意長度的數據,算出的MD5值長度都是固定的(16進制的32位數,二進制128位)。
        容易計算:從原數據計算出MD5值很容易。
        抗修改性:輸入兩個不同的明文不會得到相同的輸出值,對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。

        強抗碰撞:根據輸出值,不能得到原始的明文,即其過程不可逆。已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即僞造數據)是非常困難的。

    MD5主要應用在數字簽名、文件完整性驗證以及口令加密等方面。

    注意:

    (1)開發中,一定要和後臺開發人員約定好,MD5加密的位數是16位還是32位(大多數都是32位的),16位的可以通過32位的轉換得到。

    (2)隨着暴力破解網站的出現現在的MD5已不再是絕對安全,因此可以對MD5稍作改進,以增加解密的難度。MD5公認被破解不代表其可逆,而是一段字符串加密後的密文,可以通過強大運算計算出字符串加密後的密文對應的原始字符串,但也不是絕對的被破解。MD5加密區分大小寫,使用時要和後臺約定好。

        PS.暴力破解是指通過將明文和生成的密文進行配對,生成強大的數據庫,在數據庫中搜索,在這裏就可以破解密碼。破解網址 http://www.cmd5.com

        解決:加鹽(Salt):在明文的固定位置插入隨機串,然後再進行MD5(先加密,後亂序:先對明文進行MD5,然後對加密得到的MD5串的字符進行亂序)

    (3)介紹四種提升MD5加密安全方案:

        a:先明文加鹽,然後再進行MD5。即明文後拼接字符串(此時拼接的字符串要 足夠長+足夠鹹+足夠複雜),再進行MD5加密。

        b:先加密+後亂序:先對明文進行MD5,然後對加密得到的MD5串的字符進行亂序.

        c:亂序+加鹽+多次MD5加密等.

        d:使用消息認證機制HMAC:給定一個"祕鑰",對明文進行加密,並且做"兩次散列"!-> 得到的結果,還是 32 個字符,相對安全(KEY是服務器傳給你的,不是你寫死的).

        PS:消息的發送者和接收者有一個共享密鑰,發送者使用共享密鑰對消息加密計算得到MAC值(消息認證碼),消息接收者使用共享密鑰對消息加密計算得到MAC值,比較兩個MAC值是否一致,使用客戶端需要在發送的時候把(消息)+(消息·HMAC)一起發送給服務器,服務器接收到數據後,對拿到的消息用共享的KEY進行HMAC,比較是否一致,如果一致則信任。

3.對稱加密算法 DES、AES

    對稱加密的安全性全繫於加密密鑰的管理,在非對稱加密算法出現之前,如何動態的協商密鑰一直是個難題,大部分的應用場景都是採用通信雙方通過其他手段預先交流密鑰的方式。一旦密鑰泄漏,就會導致嚴重的安全事故。

    對稱加密算法常用的有AES和DES

        DES 數據加密標準:DES是一種分組數據加密技術(先將數據分成固定長度的小數據塊,之後進行加密),速度較快,適用於大量數據加密。3DES是一種基於DES的加密算法,使用3個不同密匙對同一個分組數據塊進行3次加密,如此以使得密文強度更高。

        AES 高級加密標準:AES算法有着更高的速度和資源使用效率,安全級別也較之更高了,被稱爲下一代加密標準。

    對稱加密的特點:
        (1)加密/解密使用相同的密鑰
        (2)加密和解密的過程是可逆的
    過程:
        (1)加密過程是先加密,再base64編碼
        (2)解密過程是先base64解碼,再解密
4.非對稱加密算法(公開密鑰加密)。常用算法有 RSA、ECC、ElGamal、揹包算法、Rabin等,iOS中用的最多的是RSA。

    非對稱加密是:一種密碼學算法類型,在這種密碼學方法中,需要一對密鑰,一個是私人密鑰,另一個則是公開密鑰。這兩個密鑰是數學相關,用某用戶密鑰加密後所得的信息,只能用該用戶的解密密鑰才能解密。如果知道了其中一個,並不能計算出另外一個。因此如果公開了一對密鑰中的一個,並不會危害到另外一個的祕密性質。稱公開的密鑰爲公鑰;不公開的密鑰爲私鑰。

    使用公開加密方式中的公鑰和私鑰可以進行數字簽名,原理是這樣子的:用私鑰加密的信息,可以用公鑰對其解密,用於客戶驗證持有私鑰一方發佈的數據或文件是完整準確的,接收者由此可知這條信息確實來自於擁有私鑰的某人,這被稱作數字簽名,公鑰的形式就是數字證書。例如,從網上下載的安裝程序,一般都帶有程序製作者的數字簽名,可以證明該程序的確是該作者(公司)發佈的而不是第三方僞造的且未被篡改過(身份認證/驗證)。

    RSA加密的基本原理 :RSA使用"密匙對"對數據進行加密解密.在加密解密數據前,需要先生成公鑰(public key)和私鑰(private key).
公鑰(public key): 用於加密數據. 用於公開, 一般存放在數據提供方, 例如iOS客戶端.
私鑰(private key): 用於解密數據. 必須保密, 私鑰泄露會造成安全問題.

關於RSA這種非對稱加密算法,在使用當中其主要作用有2個:
    信息加密:通信雙方可以在公開的網絡環境下,“安全”的商量對稱加密算法所使用的密鑰。
    電子簽名:爲了防止中間人攻擊,通信雙方在商量密鑰之前可以通過簽名算法確認對方的身份。

    非對稱加密算法本身是一種加密算法,但由於RSA本身加解密的性能在現在的計算機硬件條件下存在一定瓶頸,同時對加密數據的“安全長度”也有限制,被加密數據的長度一般要求不超過公鑰的長度。所以RSA更多的是被用來商量一個密鑰,如果密鑰是安全的,那麼後續的通信都可以使用上面提到的AES來完成,AES在性能上不存在瓶頸。

    RSA算法最經典也是最廣泛的應用場景是HTTPS,HTTPS的安全握手流程完整的闡釋了“加密”和“簽名”這兩個概念。

    RSA有另一個競爭者ECC,ECC現在使用也越來越廣泛。二者在安全性上都不存在問題。不過ECC額外的優勢,公鑰私鑰的生成速度快於RSA,在需要大量生產密鑰對的業務場景下ECC會是更好的選擇。ECC的最短安全公鑰也比RSA要短的多,224bits的ECC公鑰就已經足夠安全,而同等級別的RSA公鑰需要長達2048bits。RSA由於實現簡單,出現較早,可以預見在很長一段時間內都將和ECC共存。

    注:生成公私匙的方法,執行 項目 根目錄中 keypair/keypair.sh 腳本即可。在MAC上生成三個.pem格式的文件,一個公鑰,兩個私鑰,都可以在終端通過指令vim xxx.pem 打開,裏面是字符串,第三步生成的私鑰是java端用來解密數據的,第五步轉換格式的私鑰iOS端可以用來調試公鑰、私鑰解密(因爲私鑰不留在客戶端)。 iOS端公鑰加密私鑰解密、java端公鑰加密私鑰解密,java端私鑰加密公鑰解密都容易做到,iOS不能私鑰加密公鑰解密,只能用於驗籤。

5.HTTPS HTTP+SSL協議

HTTPS簡介
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。在HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。
HTTPS:URL表明它使用了HTTP,但HTTPS存在不同於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。
注意:HTTPS的主要思想是在不安全的網絡上創建一安全信道,並可在使用適當的加密包和服務器證書可被驗證且可被信任時,對竊聽和中間人攻擊提供合理的保護。
        HTTPS的信任繼承基於預先安裝在瀏覽器中的證書頒發機構(如VeriSign、Microsoft等)(意即“我信任證書頒發機構告訴我應該信任的”)。因此,一個到某網站的HTTPS連接可被信任,如果服務器搭建自己的https 也就是說採用自認證的方式來建立https信道,這樣一般在客戶端是不被信任的。所以我們一般在瀏覽器訪問一些https站點的時候會有一個提示,問你是否繼續。
HTTPS和HTTP區別:
    (1).https協議需要到ca申請證書,一般免費證書很少,需要交費。
    (2).http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
    (3).http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。

    (4).http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

    注意:iOS9中新增App Transport Security(簡稱ATS)特性, 讓原來請求時候用到的HTTP,全部都轉向TLS1.2協議進行傳輸。這意味着所有的HTTP協議都強制使用了HTTPS協議進行傳輸。如果我們在iOS9下直接進行HTTP請求是會報錯。系統會告訴我們不能直接使用HTTP進行請求,需要在Info.plist中控制ATS的配置。
        "NSAppTransportSecurity"是ATS配置的根節點,配置了節點表示告訴系統要走自定義的ATS設置。
        "NSAllowsAritraryLoads"節點控制是否禁用ATS特性,設置YES就是禁用ATS功能。

6.鑰匙串加密

    鑰匙串(Keychain):是蘋果公司Mac OS中的密碼管理系統。它在Mac OS 8.6中和iOS7之後被導入,並且包括在了所有後續的各版本中。一個鑰匙串可以包含多種類型的數據:密碼(包括網站,FTP服務器,SSH帳戶,網絡共享,無線網絡,羣組軟件,加密磁盤鏡像等),私鑰,電子證書和加密筆記等。

    鑰匙串加密:保存在鑰匙串的內容相當於系統對其做了保護,在設備鎖定時進行了加密處理。鑰匙串中的條目稱爲SecItem,但它是存儲在CFDictionary中的。SecItemRef類型並不存在。SecItem有五類:通用密碼、互聯網密碼、證書、密鑰和身份。在大多數情況下,我們用到的都是通用密碼。
    鑰匙串的使用和字典非常的相似,用原生的 Security.framework 就可以實現鑰匙串的訪問、讀寫。但是只能在真機上進行。通常我們使用KeychainItemWrapper來完成鑰匙串的加密。

實踐:

    本文檔相關數據加密算法的使用的項目已公開到Github。希望大家多多指正。

    Github地址:https://github.com/tiangegege/ZGNetDataSafety


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章