密碼學(xué)是研究編制密碼和破譯密碼的技術(shù)科學(xué)。研究密碼變化的客觀規(guī)律,應(yīng)用于編制密碼以保守通信秘密的,稱為編碼學(xué);應(yīng)用于破譯密碼以獲取通信情報的,稱為破譯學(xué),總稱密碼學(xué)。
密碼學(xué)的起源可追溯到2000年前。而當(dāng)今的密碼學(xué)是以數(shù)學(xué)為基礎(chǔ)的。
密碼學(xué)溯源
密碼學(xué)的歷史大致可以追溯到兩千年前,相傳古羅馬名將凱撒大帝為了防止敵方截獲情報,用密碼傳送情報。凱撒的做法很簡單,就是對二十幾個羅馬字母建立一張對應(yīng)表。這樣,如果不知道密碼本,即使截獲一段信息也看不懂。
從凱撒大帝時代到上世紀(jì)70年代這段很長的時間里,密碼學(xué)的發(fā)展非常的緩慢,因為設(shè)計者基本上靠經(jīng)驗。沒有運用數(shù)學(xué)原理。
重要節(jié)點:
RSA 加密算法
RSA
上世紀(jì) 70 年代產(chǎn)生的一種加密算法。其加密方式比較特殊,需要兩個密鑰:公開密鑰簡稱公鑰( publickey )和私有密鑰簡稱私鑰( privatekey )。公鑰加密,私鑰解密;私鑰加密,公鑰解密。這個加密算法就是偉大的 RSA .
這種算法非??煽浚荑€越長,它就越難破解。根據(jù)已經(jīng)披露的文獻,目前被破解的最長 RSA 密鑰是 768 個二進制位。也就是說,長度超過 768 位的密鑰,還無法破解(至少沒人公開宣布)。因此可以認為, 1024 位的 RSA 密鑰基本安全, 2048 位的密鑰極其安全。
( 當(dāng)然 RSA 的缺陷也很容易想到 : 效率相對較低 , 字節(jié)長度限制等 . 因此實際應(yīng)用中我們往往會結(jié)合對稱性加密一起使用 , 關(guān)鍵內(nèi)容使用 RSA )
RSA 數(shù)學(xué)原理
本小節(jié)內(nèi)容了解即可
1. 離散對數(shù)問題
問: 三的多少次方模 17 等于 12 ?
2. 歐拉函數(shù) φ
歐拉函數(shù) :
計算這個值的方式叫做歐拉函數(shù),使用: φ(n) 表示
φ(8) 有 1,3,5,7 即是 φ(8) = 4
φ(7) 有 1,2,3,4,5,6 即是 φ(8) = 6
那么 φ(56) 是多少 ?
先別急著一個個去數(shù) , 我們來看下 歐拉函數(shù)的特點 .
因此 :
如果 N 是兩個質(zhì)數(shù) P1 和 P2 的乘積則 φ(N) = φ(P1) * φ(P2) = (P1-1)*(P2-1)
那么顯然 φ(56) = φ(7) * φ(8) = 4 * 6 = 24
而 φ(63) = φ(7) * φ(9) = (7-1) * (9-1) = 48
3. 歐拉定理
如果兩個正整數(shù) m 和 n 互質(zhì),那么 m 的 φ(n) 次方減去 1 ,可以被 n 整除。
小提示: 關(guān)于定理 , 不需要我們?nèi)プC明它 , 只用記住就好.
3.1 費馬小定理
費馬小定理 就是在歐拉定理的基礎(chǔ)上 , 而當(dāng) n 為質(zhì)數(shù)時 (φ(n)結(jié)果就是n-1 .)
那么 :
如果兩個正整數(shù) m 和 n 互質(zhì) , 且 n 是質(zhì)數(shù) ,那么 m 的 n-1 次方減去 1 ,可以被 n 整除。
4. 公式轉(zhuǎn)換
如果兩個正整數(shù) e 和 x 互質(zhì),那么一定可以找到整數(shù) d ,使得 ed-1 被 x 整除。那么 d 就是 e 對于 x 的 模反元素 .
那么換算成公式 就是:
注意比較第五步和第三步中紅框部分. 也就是說當(dāng) x 等于 Φ(n) 時 :
( 其中 d 是 e 相對于 φ(n) 的模反元素 , 因為 x = Φ(n) 嘛 )
注意 : 公式推導(dǎo)第一步時 我們歐拉定理的前提是 m 和 n 互質(zhì) , 但是由于模反元素的關(guān)系 , 其實只要滿足 m < n 上述結(jié)果依然成立.
重頭戲來了 , 用實際場景來看下迪菲赫爾曼密鑰交換過程
原理:
結(jié)合我們剛剛第五步之后得出的
因此:
( 其中 d 是 e 相對于 φ(n) 的模反元素 , 因為 x = Φ(n) , 那么同樣 , e 和 φ(n) 是互質(zhì)關(guān)系 )
大家可以自己去實驗一下 . 例如: m = 3 , n = 15 , φ(n) = 8 , e = 3 , d = 11 .
到了這里 , 我們就得到了RSA算法的原理 . 那么我們對應(yīng)起來介紹一下
RSA算法的原理
( 除了公鑰用到了 n 和 e 其余的 4 個數(shù)字是不公開的。 )
HASH 算法
HASH 介紹
Hash ,一般翻譯做 “ 散列 ”,也有直接音譯為“ 哈希 ”的,就是把任意長度的輸入通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)
HASH 特點
HASH 主要用途
HASH 安全性探討
由于相同數(shù)據(jù) hash 得到的結(jié)果是一樣的 . 那么市面上大量萬億級 hash 結(jié)果記錄數(shù)據(jù)庫的存在 , 這個不可逆的算法 也另類的變成了可解密的存在.
因此 , 我們使用時經(jīng)常有以下幾種操作 :
HMAC 加密方案
HMAC 使用一個密鑰加密 , 并且做了兩次散列 . 在實際開發(fā)中 , 密鑰往往來自于服務(wù)器下發(fā)給客戶端 并且可能是根據(jù)賬戶綁定的 . 并需要結(jié)合實際業(yè)務(wù)需求來設(shè)定注冊與登錄邏輯 (新設(shè)備授權(quán)等方式來決定服務(wù)器是否可以下發(fā)密鑰給客戶端)
看到這可能大家也跟我一樣 都有個疑問 .
疑問
我不管你是如何 嵌套 加鹽 HMAC 等什么方式去對密碼做處理. 既然你登錄是一個賬號一個加密后的密碼. 我抓包工具抓到就可以直接調(diào)用接口實現(xiàn)登錄.
是啊 , 那不就 GG 了?
這就牽扯到接口安全的問題 , 其處理方法有很多種, 例如所有請求用 HTTPS , 并且使用對稱性加密和非對稱性加密結(jié)合等等方式對數(shù)據(jù)進行加密.
當(dāng)然再安全的加密算法也有被破解的風(fēng)險. 因此以下這種方式 , 大家可以理解參考一下 , 它能比較有效的解決抓包問題 :
解答
思考:
為什么以上方式可以有效防護到接口被抓包的情況 ?
HASH 題外話
可能有小伙伴碰到過上傳云盤的文件被和諧的情況 , 并且改了名字或者后綴名重新傳還是不行. 其實這就是 HASH 的一種運用場景 . 要 理解 HASH 是對二進制數(shù)據(jù)進行散列 . 那么改名字和后綴名其文件二進制是不會變化的 .
但是壓縮是可以的 .
也就是說壓縮是會改變內(nèi)存大小 , 其內(nèi)部二進制散列之后的結(jié)果也會變化 . 同樣 base64 也是會改變二進制數(shù)據(jù)的.