因爲後續會持續更新
iOS
應用安全系列文章 , 在此先更幾篇密碼學 , 應用簽名 , 爲後續展開代碼注入 , 彙編 , 砸殼等文章打下基礎.算法
密碼學是研究編制密碼和破譯密碼的技術科學。研究密碼變化的客觀規律,應用於編制密碼以保守通訊祕密的,稱爲編碼學;應用於破譯密碼以獲取通訊情報的,稱爲破譯學,總稱密碼學。數據庫
密碼學的起源可追溯到2000年前。而當今的密碼學是以數學爲基礎的。安全
密碼學的歷史大體能夠追溯到兩千年前,相傳古羅馬名將凱撒大帝爲了防止敵方截獲情報,用密碼傳送情報。凱撒的作法很簡單,就是對二十幾個羅馬字母創建一張對應表。這樣,若是不知道密碼本,即便截獲一段信息也看不懂。bash
重要節點:服務器
- 在
1976
年之前,全部的加密方法都是同一種模式:加密、解密使用同一種算法。在交互數據的時候,彼此通訊的雙方就必須將規則告訴對方,不然無法解密。那麼加密和解密的規則( 簡稱密鑰 ),它保護就顯得尤爲重要。傳遞密鑰就成爲了最大的隱患。這種加密方式被成爲 對稱加密算法(symmetric encryption algorithm
)
1976
年,兩位美國計算機學家 迪菲( W.Diffie )、赫爾曼( M.Hellman ) 提出了一種嶄新構思,能夠在不直接傳遞密鑰的狀況下,完成密鑰交換。這被稱爲「 迪菲赫爾曼密鑰交換 」算法。開創了密碼學研究的新方向.
1977
年三位麻省理工學院的數學家 羅納德·李維斯特( Ron Rivest )、阿迪·薩莫爾( Adi Shamir )和倫納德·阿德曼( Leonard Adleman )一塊兒設計了一種算法,能夠實現非對稱加密。這個算法用他們三我的的名字命名,叫作RSA
算法。
上世紀 70
年代產生的一種加密算法。其加密方式比較特殊,須要兩個密鑰:公開密鑰簡稱公鑰( publickey
)和私有密鑰簡稱私鑰( privatekey
)。公鑰加密,私鑰解密;私鑰加密,公鑰解密。這個加密算法就是偉大的 RSA
.函數
這種算法很是可靠,密鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長 RSA
密鑰是 768
個二進制位。也就是說,長度超過 768
位的密鑰,還沒法破解(至少沒人公開宣佈)。所以能夠認爲,1024
位的 RSA
密鑰基本安全,2048
位的密鑰極其安全。工具
( 固然 RSA 的缺陷也很容易想到 : 效率相對較低 , 字節長度限制等 . 所以實際應用中咱們每每會結合對稱性加密一塊兒使用 , 關鍵內容使用 RSA
)搜索引擎
本小節內容瞭解便可編碼
問: 三的多少次方模 17
等於 12
?加密
顯然 , 對於離散對數問題 , 其正向計算獲得右邊
12
很簡單. 可是反向運算時 , 就無從下手. 只能窮舉 .並且當模數使用質數
17
時 , 結果固定在1 ~ 17
之間. 而當17
這個模數足夠大時 , 就算知道採用的是這個算法 , 也知道17
這個質數和答案 , 想要再計算出來上圖中這個問號值 , 能夠想象到其難度和計算量有多大 .
歐拉函數 :
給定任意正整數 n , 在小於等於 n 的正整數中 , 能與 n 構成互質關係的正整數個數.
複製代碼
計算這個值的方式叫作歐拉函數,使用:φ(n)
表示
φ(8)
有 1,3,5,7
便是 φ(8) = 4
φ(7)
有 1,2,3,4,5,6
便是 φ(8) = 6
那麼 φ(56)
是多少 ?
先別急着一個個去數 , 咱們來看下 歐拉函數的特色 .
- 當
n
是質數的時候,φ(n) = n-1
- 當
n
能夠分解成兩個互質的整數之積,如n = A*B
則 :φ(A*B)=φ(A)* φ(B)
所以 :
若是 N
是兩個質數 P1
和 P2
的乘積則 φ(N) = φ(P1) * φ(P2) = (P1-1)*(P2-1)
那麼顯然 φ(56) = φ(7) * φ(8) = 4 * 6 = 24
而 φ(63) = φ(7) * φ(9) = (7-1) * (9-1) = 48
若是兩個正整數 m
和 n
互質,那麼 m
的 φ(n)
次方減去 1
,能夠被 n
整除。
小提示: 關於定理 , 不須要咱們去證實它 , 只用記住就好.
費馬小定理 就是在歐拉定理的基礎上 , 而當 n 爲質數時 ( φ(n)結果就是n-1 . )
那麼 :
若是兩個正整數 m
和 n
互質 , 且 n
是質數 ,那麼 m
的 n-1
次方減去 1
,能夠被 n
整除。
1
的 k
次方恆等於 1
, 那麼1*m ≡ m
, 那麼若是兩個正整數
e
和x
互質,那麼必定能夠找到整數d
,使得ed-1
被x
整除。那麼d
就是e
對於x
的模反元素 .
那麼換算成公式 就是:
注意比較第五步和第三步中紅框部分. 也就是說當 x
等於 Φ(n)
時 :
Φ(n)
嘛 )
注意 : 公式推導第一步時 咱們歐拉定理的前提是 m
和 n
互質 , 可是因爲模反元素的關係 , 其實只要知足 m < n
上述結果依然成立.
重頭戲來了 , 用實際場景來看下迪菲赫爾曼密鑰交換過程
原理:
所以:
( 其中 d 是 e 相對於 φ(n) 的模反元素 , 由於 x = Φ(n)
, 那麼一樣 , e 和 φ(n) 是互質關係 )
你們能夠本身去實驗一下 . 例如: m = 3 , n = 15 , φ(n) = 8 , e = 3 , d = 11
.
到了這裏 , 咱們就獲得了RSA算法的原理 . 那麼咱們對應起來介紹一下
一、
n
會很是大,長度通常爲1024
個二進制位。(目前人類已經分解的最大整數,232
個十進制位,768
個二進制位)二、因爲須要求出
φ(n)
,因此根據歐函數特色,最簡單的方式n
由兩個質數相乘獲得: 質數:p1
、p2
. 那麼Φ(n) = (p1 -1) * (p2 - 1)
三、最終由
φ(n)
獲得e
和d
。 總共生成 6 個數字:p一、p二、n、φ(n)、e、d
- 其中
n
和e
組成公鑰 .n
和d
組成私鑰 .m
爲明文 .c
爲密文 .
( 除了公鑰用到了 n
和 e
其他的 4 個數字是不公開的。)
Hash
,通常翻譯作 「 散列 」,也有直接音譯爲「 哈希 」的,就是把任意長度的輸入經過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,因此不可能從散列值來肯定惟一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數
MD5
獲得的結果默認是 128
位, 32
個字符(16
進制標識)HASH
並不用於加解密)用戶密碼的加密
搜索引擎 ( 根據 hash 值來匹配搜索內容 等)
版權
數字簽名
雲盤文件審覈 / 同文件識別
...等等
因爲相同數據 hash
獲得的結果是同樣的 . 那麼市面上大量萬億級 hash
結果記錄數據庫的存在 , 這個不可逆的算法 也另類的變成了可解密的存在.
所以 , 咱們使用時常常有如下幾種操做 :
HMAC
使用一個密鑰加密 , 而且作了兩次散列 . 在實際開發中 , 密鑰每每來自於服務器下發給客戶端 而且多是根據帳戶綁定的 . 並須要結合實際業務需求來設定註冊與登陸邏輯 ( 新設備受權等方式來決定服務器是否能夠下發密鑰給客戶端 )
看到這可能你們也跟我同樣 都有個疑問 .
我無論你是如何
嵌套
加鹽
HMAC
等什麼方式去對密碼作處理. 既然你登陸是一個帳號一個加密後的密碼. 我抓包工具抓到就能夠直接調用接口實現登陸.
是啊 , 那不就 GG
了?
這就牽扯到接口安全的問題 , 其處理方法有不少種, 例如全部請求用HTTPS
, 而且使用對稱性加密和非對稱性加密結合等等方式對數據進行加密.
固然再安全的加密算法也有被破解的風險. 所以如下這種方式 , 你們能夠理解參考一下 , 它能比較有效的解決抓包問題 :
HMAC
的模式 , 也就是註冊時 , 客戶端把用戶名傳給服務器 .key
將用戶明文密碼進行 HMAC
散列後發給服務器保存.HMAC
以後的 hash
值 加上精確到分的時間戳 ( 時間統一爲服務器下發時間 , 相信你們項目也都是使用了服務器時間.
) 而後進行散列.HMAC
後的密碼進行 hash
. 兩次有一次成功即爲登陸成功.爲何以上方式能夠有效防禦到接口被抓包的狀況 ?
HMAC
以後的 hash
值 只有在註冊該帳戶時被傳輸過一次 .HMAC
以後的 hash
值進行散列 很難猜出嵌套方式.HMAC
以後的 hash
值 ) 每次都不同 , 並且有效期只有最多 1 分 59 秒,最少一分鐘 ( 有效期可靈活控制 ) 也就是說抓包人員抓到請求源數據後 , 必須在兩分鐘之內登陸 , 不然就會失效.可能有小夥伴碰到過上傳雲盤的文件被和諧的狀況 , 而且改了名字或者後綴名從新傳仍是不行. 其實這就是 HASH
的一種運用場景 . 要 理解 HASH
是對二進制數據進行散列 . 那麼更名字和後綴名其文件二進制是不會變化的 .
可是壓縮是能夠的 .
base64
也是會改變二進制數據的.