1. 程式人生 > IOS開發 >iOS逆向——HASH&對稱加密

iOS逆向——HASH&對稱加密

文章僅供課後複習,感謝hank老師。

HASH概述

Hash,一般翻譯做“雜湊” ,也有直接音譯為“雜湊”的,就 是把任意長度的輸入通過雜湊演算法變換成固定長度的輸 出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也 就是,雜湊值的空間通常遠小於輸入的空間,不同的輸 入可能會雜湊成相同的輸出,所以不可能從雜湊值來確 定唯一的輸入值。簡單的說就是一種將任意長度的訊息 壓縮到某一固定長度的訊息摘要的函式。

HASH的特點

  • 演算法是公開的
  • 對相同資料運算,得到的結果是一樣的
  • 對不同資料運算,如MD5得到的結果預設是128位,32個字元(16進位制標識)
  • 沒法逆運算
  • 資訊摘要,資訊“指紋” ,是用來做資料識別的

HASH的用途

  • 使用者密碼的加密
  • 搜尋引擎
  • 版權
  • 數字簽名

密碼加密

密碼是不能以任何明文方式儲存。所以通過運用HASH演算法,給使用者的密碼進行加密。

  • 直接使用md5加密(不安全)
  • md5加鹽(如果暴力破解鹽,此方法也不安全)
  • HMAC加密方案(推薦)
  • 新增自己的加密邏輯(推薦)

HMAC加密方案

  1. HMAC加密
  2. 使用一個祕鑰加密資料做兩次雜湊
  3. 祕鑰來自伺服器
  4. 傳送一個賬號,伺服器生成一個key(祕鑰),伺服器儲存帳號,賬號對應的key,key給客戶端進行明文加密(HMAC密碼),發給伺服器儲存,註冊成功
  5. 使用已經存在的key(祕鑰)對帳號加密,帶著key、HMAC密碼、伺服器時間戳,帳號區伺服器驗證
  • 由於加入時間戳的限制,往往破解,僅能在1-2分鐘執行嘗試登陸
  • 單純的破解key,只能對單個賬號存在風險, key洩漏只是一個使用者的


數字簽名

簽名就是用來這個東西是你的,你在支票上簽名,就證明支票是你的。那麼數字簽名,就是用於鑑別數字資訊的方法。所以數字簽名就包含了簽名+驗證,防止被篡改。

之前上一章講過RSA加密,公鑰、私鑰、非對稱加密。

在做數字簽名的時候,往往不直接使用私鑰對明文進行簽名。但是單純的使用RSA加密又不能滿足我們的需求。之前我們提過,RSA只適合用於小資料加密。所以我們要用到HASH演算法來驗證資料的完整性,再用RSA加密演算法對HASH資料進行保護。

此時客戶端傳送原始資料,和經RSA加密後的該資料的hash值。伺服器對RSA加密的資料進行解密,得到原始資料的hash值,接下來對原始資料進行同樣的Hash演算法,將得到的Hash值和解密後的Hash值做對比,如果一致則保證資料有效性,整個過程中,如果解密的Hash值和原始的Hash值不一致,或者無法解密RSA的資料,都說明資料被篡改了。

所以我們說,對原始資料Hash值進行RSA加密後的資料,是原始資料的數字簽名。其實就是對原始資料的Hash值進行非對稱加密。


對稱加密

對稱加密方式:明文通過金鑰加密得到密文。密文通過 金鑰解密得到明文。

常見的演算法

  • DES 資料加密標準(用得少,因為強度不夠)
  • 3DES 使用3個金鑰,對相同的資料執行3次加密,強度增強(剛出生就over)
  • AES 高階密碼標準。(鑰匙串訪問)

應用模式

  • ECB(Electronic Code Book):電子密碼本模式。每一塊資料,獨立加密。 

最基本的加密模式,也就是通常理解的加密,相同的明文將永遠加密成相同的密文,無初始向量,容易受到密 碼本重放攻擊,一般情況下很少用。

  • CBC(Cipher Block Chaining):密碼分組連結模式。使用一個金鑰和一個初始化向量[iv]執行加密

明文被加密前要與前面的密文進行異或運算後再加密,因此只要選擇不同的初始向量,相同的密文加密後會形 成不同的密文,這是目前應用最廣泛的模式。CBC加密後的密文是上下文相關的,但明文的錯誤不會傳遞到後 續分組,但如果一個分組丟失,後面的分組將全部作廢(同步錯誤)。

CBC可以有效的保證密文的完整性,如果一個數據塊在傳遞是丟失或改變,後面的資料將無法正常解密。

多說一句,CBC防竊聽方案常用。


終端命令

加密,AES(ECB)加密“hello”字串

$ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64複製程式碼

解密,AES(ECB)解密

$ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt –d複製程式碼

加密,AES(CBC)加密“hello”字串

$ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64複製程式碼

解密,AES(CBC)解密

$ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K
616263 -nosalt –d複製程式碼