iOS逆向——HASH&對稱加密
文章僅供課後複習,感謝hank老師。
HASH概述
Hash,一般翻譯做“雜湊”
,也有直接音譯為“雜湊”的,就
是把任意長度的輸入通過雜湊演算法變換成固定長度的輸
出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也
就是,雜湊值的空間通常遠小於輸入的空間,不同的輸
入可能會雜湊成相同的輸出,所以不可能從雜湊值來確
定唯一的輸入值。簡單的說就是一種將任意長度的訊息
壓縮到某一固定長度的訊息摘要的函式。
HASH的特點
- 演算法是公開的
- 對相同資料運算,得到的結果是一樣的
- 對不同資料運算,如MD5得到的結果預設是128位,32個字元(16進位制標識)
- 沒法逆運算
- 資訊摘要,資訊“指紋” ,是用來做資料識別的
HASH的用途
- 使用者密碼的加密
- 搜尋引擎
- 版權
- 數字簽名
密碼加密
密碼是不能以任何明文方式儲存。所以通過運用HASH演算法,給使用者的密碼進行加密。
- 直接使用md5加密(不安全)
- md5加鹽(如果暴力破解鹽,此方法也不安全)
- HMAC加密方案(推薦)
- 新增自己的加密邏輯(推薦)
HMAC加密方案
- HMAC加密
- 使用一個祕鑰加密資料做兩次雜湊
- 祕鑰來自伺服器
- 傳送一個賬號,伺服器生成一個key(祕鑰),伺服器儲存帳號,賬號對應的key,key給客戶端進行明文加密(HMAC密碼),發給伺服器儲存,註冊成功
- 使用已經存在的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複製程式碼