iOS RSA的網路安全模型、iOS簽名機制總結(登入、token安全、簽名)

發表於2016-03-26

最近公司準備做一個安全級別比較高的專案:技術總監給我們提出了一個這樣子的需求:在http請求過程中,即使嗅探器捕獲到網路請求的連結也無法去請求到資料。經過一番思考,覺得支付寶的簽名完全符合這樣子的需求。但是之前自己對簽名、RSA等知識也是知道的很少,所以花了一番功夫學習了一下。本文將針對RSA登入和http請求作講解,希望對大家有所幫助。

一.登入、登入保持(http請求)

登入機制

登入機制大概可以分為一下三個階段:

第一種網路請求情況(安全級別:II)

一般的情況是這個樣子的:一但使用者登陸成功(單方面MD5加密:伺服器加密則客戶端不加密,客戶端加密則明文傳輸),伺服器為客戶端分配sessionID(也可以稱為userID),當然有些伺服器不但為客戶端分配了userID還有可能會為使用者提供token了(這個下面會做解釋),然後每次網路請求都將sessionID當做引數傳遞給伺服器。

優點

能夠保持使用者登入狀態、區分使用者,相對於不返回任何資訊的登入要安全了一些。

缺點

如果通過網路嗅探器(例如:青花瓷)可以獲取到http連結,這樣子伺服器返回的sessionID便會被獲取到,這樣子依然會造成資訊洩露,並且還能被偽造請求(瀏覽器請求)。

第二種網路請求情況 (安全級別:III)

第一種存在明顯的安全隱患,但是目前市面上的好多app依然採用第一種方法去實現登入、網路請求,但是對於安全級別較高的app,已經不再適用了。所以在此基礎上進行優化—-採用非對稱加密(公鑰、私鑰)。

登入模型

客戶端第一次發出登入請求時, 使用者密碼以明文的方式傳輸, 一旦被截獲, 後果嚴重。因此密碼需要加密,例如可採用RSA非對稱加密。具體流程如下:

  1. 客戶端向伺服器第一次發起登入請求(不傳輸使用者名稱和密碼)。
  2. 伺服器利用RSA演算法產生一對公鑰和私鑰。並保留私鑰, 將公鑰傳送給客戶端。
  3. 客戶端收到公鑰後, 加密使用者密碼, 向伺服器發起第二次登入請求(傳輸使用者名稱和加密後的密碼)。
  4. 伺服器利用保留的私鑰對密文進行解密,得到真正的密碼。
第三種網路請求情況(安全級別:IIII)

再仔細核對上述登入流程, 我們發現伺服器判斷使用者是否登入, 完全依賴於sessionId, 一旦其被截獲, 黑客就能夠模擬出使用者的請求。於是我們需要引入token的概念: 使用者登入成功後, 伺服器不但為其分配了sessionId, 還分配了token, token是維持登入狀態的關鍵祕密資料。在伺服器向客戶端傳送的token資料,也需要加密。於是一次登入的細節再次擴充套件。

  • 客戶端向伺服器第一次發起登入請求(不傳輸使用者名稱和密碼)。
    伺服器利用RSA演算法產生一對公鑰和私鑰。並保留私鑰, 將公鑰傳送給客戶端。
  • 客戶端收到公鑰後, 加密使用者密碼,向伺服器傳送使用者名稱和加密後的使用者密碼; 同時另外產生一對公鑰和私鑰,自己保留私鑰, 向伺服器傳送公鑰; 於是第二次登入請求傳輸了使用者名稱和加密後的密碼以及客戶端生成的公鑰。
  • 伺服器利用保留的私鑰對密文進行解密,得到真正的密碼。 經過判斷, 確定使用者可以登入後,生成sessionId和token, 同時利用客戶端傳送的公鑰,對token進行加密。最後將sessionId和加密後的token返還給客戶端。
  • 客戶端利用自己生成的私鑰對token密文解密, 得到真正的token。
    圖示如下:
    login-300×181.png
    登入保持(也就是http資料請求階段)

    引入token後,http請求被獲取問題便可得到解決。 伺服器將token和其它的一些變數, 利用雜湊加密演算法得到簽名後,連同sessionId一併傳送給伺服器; 伺服器取出儲存於伺服器端的token,利用相同的法則生成校驗簽名, 如果客戶端簽名與伺服器的校驗簽名一致, 就認為請求來自登入的客戶端。(支付寶一樣的機制)
    結構圖如下:

    keep_login.png

    注:token失效的兩種情況:

    失效原理:
    在伺服器端的redis中刪除相應key為session的鍵值對。

二.雜湊演算法

雜湊是資訊的提煉,通常其長度要比資訊小得多,且為一個固定長度。加密性強的雜湊一定是不可逆的,這就意味著通過雜湊結果,無法推出任何部分的原始資訊。任何輸入資訊的變化,哪怕僅一位,都將導致雜湊結果的明顯變化,這稱之為雪崩效應。雜湊還應該是防衝突的,即找不出具有相同雜湊結果的兩條資訊。具有這些特性的雜湊結果就可以用於驗證資訊是否被修改。

雜湊演算法可以用來加密token生成簽名, 以便token資訊不暴露在網路同時還能驗證登入的有效性。

MD5

全寫: Message Digest Algorithm MD5(中文名為訊息摘要演算法第五版)
輸出: 128bit

MD5演算法具有以下特點:

1、壓縮性:任意長度的資料,算出的MD5值長度都是固定的。
2、容易計算:從原資料計算出MD5值很容易。
3、抗修改性:對原資料進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。
4、弱抗碰撞:已知原資料和其MD5值,想找到一個具有相同MD5值的資料(即偽造資料)是非常困難的。
5、強抗碰撞:想找到兩個不同的資料,使它們具有相同的MD5值,是非常困難的。
缺陷:Md5一度被認為十分靠譜。2004年8月17日的美國加州聖巴巴拉的國際密碼學會議(Crypto’2004)上,來自中國山東大學的王小云教授做了破譯MD5、HAVAL-128、 MD4和RIPEMD演算法的報告,公佈了MD系列演算法的破解結果。2009年,馮登國、謝濤二人利用差分攻擊,將MD5的碰撞演算法複雜度從王小云的2^42進一步降低到2^21,極端情況下甚至可以降低至2^10。僅僅2^21的複雜度意味著即便是在2008年的計算機上,也只要幾秒便可以找到一對碰撞。Md5已老, 在安全性要求較高的場合,不建議使用。

SHA1

全名: 安全雜湊演算法(Secure Hash Algorithm)輸出: 160bit
與Md5比較
相同點:因為二者均由MD4匯出,SHA-1和MD5彼此很相似。相應的,他們的強度和其他特性也是相似。不同點:1. 對強行攻擊的安全性:最顯著和最重要的區別是SHA-1摘要比MD5摘要長32 位。使用強行技術,產生任何一個報文使其摘要等於給定報摘要的難度對MD5是2^128數量級的操作,而對SHA-1則是2^160數量級的操作。這樣,SHA-1對強行攻擊有更大的強度。2. 對密碼分析的安全性:由於MD5的設計,易受密碼分析的攻擊,SHA-1顯得不易受這樣的攻擊。3. 速度:在相同的硬體上,SHA-1的執行速度比MD5慢。

加鹽

所謂加鹽, 就是在原本需要加密的資訊基礎上,糅入其它內容salt。簽名的生成就是一次加鹽。

對稱加密

本系統使用對稱加密對使用者密碼進行加密以及生成token字串。
AuthCode加密
AuthCode是康盛科技發明的加密方式, 開源產品Discuz的密碼是用這個演算法進行加密。但是有點遺憾,這個函式所有權屬於康盛創想,並不能自由使用的。不知使用是否有風險??
AES加密
高階加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。

非對稱加密

RSA是目前最有影響力的公鑰加密演算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被ISO推薦為公鑰資料加密標準。RSA的安全基於大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進位制數或更大)的函式。從一個公鑰和密文恢復出明文的難度,等價於分解兩個大素數之積(這是公認的數學難題)。
演算法描述:
(1)選擇一對不同的、足夠大的素數p,q。
(2)計算n=pq。
(3)計算f(n)=(p-1)(q-1),同時對p, q嚴加保密,不讓任何人知道。
(4)找一個與f(n)互質的數e(公鑰指數),且1(5)計算d(私鑰指數),使得de≡1 mod f(n)。這個公式也可以表達為d ≡e-1 mod f(n)注,≡是數論中表示同餘的符號。
(6)公鑰KU=(e,n),私鑰KR=(d,n)。
(7)加密時,先將明文變換成0至n-1的一個整數M。若明文較長,可先分割成適當的組,然後再進行交換。設密文為C,則加密過程為:

(8)解密過程為:


轉自:http://blog.csdn.net/m372897500/article/details/50905017 略作了補充

相關文章