1. 程式人生 > IOS開發 >iOS逆向學習之十一(加密、簽名)

iOS逆向學習之十一(加密、簽名)

學前須知

虛擬人物設計

為了方便我們學習iOS的簽名機制,本文設定了4個虛擬人物,分別是

  • Alice、Bob:相互通訊
  • EVe:竊聽者
  • Mallory:主動攻擊者

訊息通訊與竊聽

  • 未使用加密時,通訊雙方以明文通訊

  • 但是這種通訊方式很容易被他人竊聽,從而被盜取機密資訊

  • 那麼如何防止資訊被監聽呢?就需要對通訊資訊進行加密操作。
    • 首先將明文加密成密文傳送給接收方

- 接收方拿到密文後進行解密得到明文資料

- 通過加密之後,就算有他人竊聽通訊資料,也只能得到被加密後的密文資料

加密解密?

如何進行加密解密?

訊息傳送者使用金鑰進行加密

訊息接收者使用金鑰進行解密

密碼的型別

根據金鑰的使用方式,我們可以將密碼分為兩種

對稱密碼

對稱密碼就是加密和解密使用相同金鑰

常用的對稱密碼演算法有三種

DES(Data Encryption Standard)

DES是一種將64bit明文加密成64bit密文的對稱密碼演算法,金鑰長度是56bit。其實從規格上來說,金鑰的長度其實是64bit,但是每隔7bit會設定一個用於錯誤檢查的bit,因此金鑰的長度實質上是56bit。
由於DES每次只能加密64bit的資料,遇到較大資料時需要對DES加密進行迭代。而且由於DES加密演算法已經可以在短時間內破解,所有不建議使用。

3DES

3DES是將DES重複3次所得到的一種密碼演算法,也叫做3重DES,此演算法目前還被一些銀行機構使用,但是處理速度不高,且有安全性問題。

  • 3DES加密過程如下,將明文通過加密-解密-加密成密文

  • 3DES解密過程如下,將密文通過解密-加密-解密成明文

以上加密解密過程中,3個金鑰都是不同的,所以又稱為DES-EDE3

  • 如果以上過程的所有金鑰都相同,則結果和普通的DES等價,3次加密解密就沒有任何意義

  • 如果金鑰1、金鑰3相同,金鑰2不同,則稱為DES-EDE2

AES(Advanced Encryption Standard)

AES是用來取代DES稱為新標準的一種對稱密碼演算法,AES的金鑰長度有128、192、256bit三種。

金鑰配送問題

什麼是金鑰配送問題?

使用對稱密碼時,一定會遇到金鑰配送問題,具體如下圖

假設Alice將使用對稱密碼加密後的訊息傳送給Bob,Bob想要檢視明文資訊,就需要拿到Alice加密的金鑰,所以Alice同時要將金鑰傳送給Bob,在傳送金鑰的過程中,可能會被Eve竊聽,Eve拿到竊取的金鑰和密文,同樣可以解析得到明文訊息。

怎樣解決金鑰配送問題?

解決金鑰配送問題,有以下幾種方式

  • 事先共享金鑰。也就是Alice和Bob事先私下共享金鑰,不能通過網路傳輸。不過這種方式非常麻煩,不建議使用。
  • 金鑰分配中心
  • Diffie-Hellman金鑰交換
  • 公鑰密碼。公鑰密碼是現在普遍使用的一種方式,也是我們主要學習的一種方式。

公鑰密碼(Public-key Cryptography)

公鑰密碼中,金鑰分為加密金鑰和解密金鑰兩種,它們不是同一個金鑰,所以公鑰密碼又被稱為非對稱密碼(Asymmetric Cryptography)

在公鑰密碼中:

  • 加密金鑰是公開的,所以該金鑰稱為公鑰(public key)。
  • 解密金鑰,由訊息接收者自己保管,不能公開,因此也稱為私鑰(private key)。
  • 公鑰和私鑰是一一對應,不能單獨生成的,一對公鑰和私鑰統稱為金鑰對(key pair)
  • 由公鑰加密的密文,必須使用該公鑰對應的私鑰才能解密。
  • 由私鑰加密的密文,必須使用該私鑰對應的公鑰才能解密。

公鑰密碼解決金鑰配送問題

上面說到,金鑰配送問題可以通過公鑰密碼來解決,具體解決流程如下:

  • 首先,訊息接收者生成一對公鑰和私鑰。
  • 將公鑰發給訊息傳送者
  • 訊息傳送者用公鑰對訊息進行加密。
  • 訊息傳送者將加密後的密文傳送給訊息接收者
  • 訊息接收者用私鑰對密文進行解密,得到明文資料。

RSA

RSA是目前使用最廣泛的公鑰密碼演算法。它的名字是由3位開發者Ron Rivest、Adi Shamir、Leonard Adleman的姓氏首字母組成

混合密碼系統

對稱密碼和非對稱密碼的對比

  • 對稱密碼不能很好的解決金鑰配送問題
  • 公鑰密碼加密和解密速度比較慢,因為訊息本身多大,加密後的密文就有多大,所以對於大批量的資料,加密解密速度過慢。
  • 為了解決金鑰配送問題,同時提升加密解密的速度。於是採取了將對稱密碼和公鑰密碼相結合的方式,取長補短。現在網路上密碼通訊所用到的SSL/TLS都是運用了混合密碼系統。

混合密碼系統-加密

會話金鑰(session key)

  • 會話金鑰是專門為本次通訊隨機生成的臨時的金鑰,使用偽隨機數生成器來生成
  • 會話金鑰作為對稱密碼的金鑰,用來對訊息進行加密,從而提高速度

加密步驟-傳送訊息

  • 第一步,訊息傳送者需要拿到訊息接收者的公鑰
  • 第二步,生成會話金鑰,作為對稱密碼的金鑰,將訊息加密成密文
  • 第三步,使用訊息接收者的公鑰,來加密會話金鑰
  • 第四步,將第二步和第三步生成的加密結果一起傳送給訊息接收者

傳送的內容包括

  • 用會話金鑰加密的訊息(使用對稱密碼加密)
  • 用公鑰加密的會話金鑰(使用公鑰密碼加密)

混合密碼系統-解密

收到==訊息傳送者==發過來的訊息之後,需要進行解密操作,具體步驟如下:

  • 第一步,訊息接收者用自己的私鑰解密出會話金鑰
  • 第二步,用第一步解密得到的會話金鑰解密訊息,得到明文資料

混合密碼系統-加密解密完整步驟總結

使用Alice作為==訊息傳送者==,Bob作為訊息接收者

傳送訊息(加密)

  1. Bob首先生成一對公鑰、私鑰
  2. Bob將公鑰共享給Alice
  3. Alice隨機生成一個會話金鑰(臨時金鑰)
  4. Alice用會話金鑰加密需要傳送的訊息(對稱密碼加密)
  5. Alice用Bob的公鑰加密會話金鑰(公鑰密碼加密、也稱為非對稱密碼加密)
  6. Alice將4、5步加密得到的結果一起傳送給Bob

接收訊息(解密)

  1. Bob利用自己的私鑰解密會話金鑰(公鑰密碼解密、也稱為非對稱密碼解密)
  2. Bob使用會話金鑰解密傳送過來的訊息(對稱密碼解密)

單項雜湊函式(雜湊函式)

單向雜湊函式可以根據訊息內容計算出雜湊值。並且雜湊值的長度和訊息的長度無關,無論是1bit、10M、100G的訊息,單向雜湊函式都會計算出固定長度的雜湊值。

單向雜湊函式的特點

  • 根據任意長度的訊息,計算出固定長度的雜湊值。
  • 計算速度快,能夠快速計算出雜湊值
  • 訊息不同,哪怕就相差1bit資料,雜湊值也不同

  • 具備單向性,不可逆

常用的單向雜湊函式

單向雜湊函式又稱為訊息摘要函式、雜湊函式。輸出的雜湊值也被稱為訊息摘要、指紋。

常見的幾種單向雜湊函式如下

MD4、MD5

產生128bit的雜湊值,MD就是Message Digest的縮寫,目前已經不安全

SHA-1

產生160bit的雜湊值,目前也不安全

SHA-2

SHA-256、SHA-384、SHA-512,雜湊值的長度分別為256bit、384bit、512bit。雜湊值長度越大,安全性就越高

SHA-3

SHA3(Secure Hash Algorithm-3)是一種作為新標準釋出的單向雜湊函式演算法,用來替代在理論上已被找出攻擊方法的SHA-1演算法。全世界企業和密碼學家提交了很多SHA-3的候選方案,經過長達5年的選拔,最終於2012年正式確定將Keccak演算法作為SHA-3標準。

單向雜湊函式的應用

防止資料被篡改

  • 防止檔案被篡改,具體的做法是將檔案通過單向雜湊函式得到雜湊值。將雜湊值存放到安全的地方。如果一段時間後,檔案被篡改,那麼拿到最新的檔案,通過單向雜湊函式,得到最新的雜湊值,同之前的雜湊值進行對比,就可以確定檔案是否被篡改。

  • 軟體被篡改。一般為了分散通訊負荷,一些軟體公司會將自己的軟體放在映象站點上供使用者下載。那麼使用者如何判斷從映象站點下載的軟體是否被惡意篡改呢?一般軟體公司會將軟體通過雜湊函式得到的雜湊值放在官網上,供使用者來對比,只要使用者下載的軟體得到的雜湊值和官網一致,那麼就表明使用者下載的軟體沒有被惡意篡改過。例如軟體VNC,可點選VNC官網檢視。

口令加密

在App登入時,一般都需要進行賬號和密碼的校驗,但是在資料庫中,儲存的密碼一般都是進行SHA-2雜湊函式之後的雜湊值而不是明文密碼,所以在登入時需要對使用者輸入的密碼進行雜湊演算法,得到雜湊值,再同資料庫儲存的雜湊值進行比較,從而判斷密碼是否正確。

並且,由於雜湊函式的不可逆,就算他人通過不正當手段獲取到資料庫中存放的密碼的雜湊值,也無法獲取到使用者的真實密碼。這樣就大大增加了使用者資料的安全性。

數字簽名

其實,不管是使用之前的對稱加密、非對稱加密還是混合密碼系統,都無法驗證訊息的真實性。也就是說訊息的接收者無法判斷這條訊息是否是訊息傳送者所發出的。也有可能是他人偽裝成訊息傳送者發出的訊息。那麼怎麼來驗證訊息的真實性呢?通過數字簽名的方式來驗證。

數字簽名的兩種行為

  • 生成簽名。主要由訊息傳送者完成,通過“簽名金鑰”生成
  • 驗證簽名。由訊息接收者完成,通過“驗證金鑰”驗證

那麼,如何保證這個簽名是訊息傳送者自己籤的呢?答案就是使用訊息傳送者自己的私鑰進行簽名。上文中,我們知道公鑰金鑰是公開的,所有人都能拿到的,所以在公鑰密碼中,任何人都能使用公鑰進行加密。

而在數字簽名中,任何人都可以使用公鑰來驗證簽名。

數字簽名和公鑰密碼的對比

數字簽名其實就是將公鑰密碼反過來使用

數字簽名的過程

普通數字簽名過程

  • 首先,訊息傳送者生成一對公鑰、私鑰。
  • 訊息傳送者將公鑰傳送給訊息接收者。
  • 訊息傳送者用自己的私鑰對訊息進行加密,得到簽名信息。
  • 訊息傳送者將訊息和簽名一起傳送給訊息接收者
  • 訊息接收者使用訊息傳送者的公鑰對簽名信息進行解密,得到簽名中的訊息
  • 訊息接收者將解密得到的訊息和直接得到的訊息進行對比,如果兩者一致,則說明簽名驗證成功

但是這樣的簽名過程速度很慢,因為簽名信息是通過加密原有的訊息獲得,如果訊息大小是1M,加密後的簽名大小也是1M,最後傳送給訊息接收者的訊息就是2M

改進數字簽名過程

在之前數字簽名的過程上使用單向雜湊函式進行改進。

  • 首先訊息傳送者使用單向雜湊函式計算訊息的雜湊值
  • 訊息傳送者使用自己的私鑰對第一步獲取到的雜湊值進行加密,生成簽名信息
  • 訊息傳送者將簽名信息和訊息一起傳送給訊息接收者
  • 訊息接收者使用訊息傳送者的公鑰對簽名信息進行解密,得到解密後的雜湊值
  • 訊息接收者對訊息進行單向雜湊計算,得到雜湊值
  • 訊息接收者將簽名中解密得到的雜湊值和直接進行雜湊函式得到的雜湊值進行對比,如果一致則簽名驗證成功。

完整的簽名過程

數字簽名的作用

綜合以上幾點,可以總結出數字簽名的作用:

  • 確認訊息是否完整
  • 識別訊息內容是否被篡改
  • 防止訊息傳送者否認傳送此訊息

數字簽名的問題

  • 首先思考一下,如果有人篡改了檔案的內容或者是簽名的內容,會導致什麼結果?結果就是簽名驗證失敗,證明了檔案內容被篡改。
  • 再者,數字簽名的過程中,將訊息的明文直接傳送給了訊息接收者,無法保證訊息的安全性?數字簽名的作用並不是為了保證資料的機密性,僅僅是為了能夠識別訊息內容有沒有被篡改。

要想正確的使用數字簽名,就必須驗證簽名的公鑰必須屬於真正的傳送者。因為在訊息傳送者訊息接收者之間可能會遭遇中間人攻擊,具體攻擊步驟如下:

  • 訊息接收者將自己的公鑰傳送給訊息傳送者
  • 中間人竊聽到了通訊的內容,獲取到了訊息接收者發出去的公鑰。
  • 中間人攔截訊息接收者的公鑰,將自己的公鑰傳送給了訊息傳送者
  • 訊息傳送者誤以為是訊息接收者傳送過來的公鑰,使用接收到的公鑰對訊息進行加密,然後將密文傳送給訊息接收者
  • 中間人攔截到密文,使用自己的私鑰進行解密,獲取到明文訊息。然後使用之前攔截到的訊息接收者的公鑰對訊息進行加密,將偽造的密文傳送給訊息接收者
  • 訊息接收者接收到密文,用自己的私鑰進行解密,最終得到明文訊息。

以上的訊息傳遞過程中,訊息傳送者和訊息接收者無法察覺到中間人的存在,但是訊息已經bei被洩漏了。

上面的通訊過程遭遇到了中間人的攻擊,會導致

  • 公鑰是中間人偽造的
  • 數字簽名失效

因此,在驗證簽名之前,首先得驗證公鑰的合法性。如何驗證公鑰的合法性呢?就需要通過證書

證書

看到證書,我們會聯想到駕駛證、畢業證等等,這些證書都是由權威機構認證的。在密碼學中的證書,全稱叫做公鑰證書(Public-key Certificate,PKC)。和駕駛證、學生證類似。

  • 證書中有姓名、郵箱等個人資訊,以及此人的公鑰
  • 並且有認證機構(Certificate Authority,CA)施加數字簽名

CA就是能夠認定“公鑰確實屬於此人”並能夠生成數字簽名的個人或者組織

  • 有國際性組織、政府設立的組織
  • 有通過提供認證服務來盈利的企業
  • 個人也可以成立認證機構

證書的使用

證書的使用有以下幾個步驟:

  1. 訊息接收者生成自己的金鑰對 2.訊息接收者認證機構註冊自己的公鑰
  2. 認證機構用自己的私鑰對訊息接收者的公鑰施加數字簽名,並且生成證書
  3. 訊息傳送者認證機構那得到帶有認證機構數字簽名的訊息接收者的公鑰(證書)
  4. 訊息傳送者使用認證機構的公鑰驗證數字簽名,確認訊息接收者公鑰的合法性。
  5. 訊息傳送者使用訊息接收者公鑰加密訊息,並且傳送給訊息接收者
  6. 訊息接收者使用自己的私鑰解密密文得到最終的訊息

增加認證機構認證流程之後,訊息傳送者和訊息接收者之間,就不存在公鑰的傳遞過程,訊息傳送者從認證機構獲取訊息接收者的公鑰,這樣就杜絕了中間人攻擊導致公鑰偽造的問題

證書的註冊和下載流程如下

  • 訊息接收者認證機構註冊公鑰
  • 認證機構訊息接收者的公鑰進行數字簽名,生成證書儲存到倉庫中
  • 訊息傳送者認證機構的倉庫中下載證書
  • 訊息傳送者使用認證機構的公鑰對證書進行驗證,得到訊息接收者的公鑰