RSA初探,聊聊怎麼破解HTTPS

這篇文章跟你們討論一個比較有意思的問題:怎麼破解https?你們都知道,如今幾乎整個互聯網都採用了https,不是https的網站某些瀏覽器還會給出警告。面試中也常常問到https,本文會深刻https原理,一直講到https破解思路。前端

HTTPS

要想破解https,必須先知道https原理,下面咱們先來說講https原理。git

公私鑰

https的公私鑰常常在面試中出現,各類面經也會給出答案:https有兩個祕鑰,公鑰和私鑰,網站本身持有私鑰,用戶持有公鑰,網站用本身的私鑰加密數據發給用戶,用戶用公鑰解密數據。用戶要發信息就反過來,用戶用公鑰加密數據,網站用私鑰解密數據。這種加密和解密使用不一樣祕鑰的加密算法叫作非對稱加密。這個流程有點繞,下面舉例來講明下,假設網站A啓用了https,小明要來訪問這個網站了(如下例子僅爲講解公私鑰用途,並不是https真實流程,真實流程是「HTTPS握手流程」一節):github

  1. 網站A啓用https,天然有一對祕鑰,私鑰和公鑰,私鑰他本身藏起來了,公鑰任何訪問用戶均可以拿到
  2. 小明訪問網站A,拿到了A的公鑰
  3. 小明要給網站A發消息就用公鑰給信息加密,而後發給網站A
  4. 網站A拿到密文後,用本身的私鑰解密獲得消息內容
  5. 網站A要給小明回信,用本身的私鑰加密信息,發送給小明
  6. 小明拿到密文後,用本身手上的公鑰解密信息

經過上面的流程咱們能夠看出,因爲公鑰是公開的,因此網站私鑰加密的信息其實全部用戶均可以解開。**在這一個階段,保護的實際上是用戶發給服務器的數據,由於用戶加密的數據必需要服務器的私鑰才能解開。**這裏你們想一個有意思的問題:既然全部用戶都能拿到公鑰,那是否是小明加密的信息,小紅也能解開呢,由於小紅也有公鑰啊?若是小紅也能解開,那小紅只要截獲了小明的流量,不就知道內容了嗎?這個問題簡化一下就是,**公鑰加密的信息用同一個公鑰能解開嗎?答案是不能!**要知道這個緣由必需要知道RSA算法,咱們後面會講,先一步步來。面試

數字證書

前面小明訪問網站A的流程是有隱患,能夠被攻擊的。假設小紅是個中間人黑客,如今想攻擊小明,她偷偷在小明電腦上作了手腳,將網站A的公鑰換成了本身的:算法

  1. 小明訪問網站A,網站A給小明發送公鑰,可是這一步被小紅攻擊了
  2. 小紅劫持了小明的流量,將網站A發過來的公鑰替換成了本身的公鑰
  3. 小明拿到了錯誤的公鑰,用這個公鑰加密本身的信息,這個信息可能包含他的用戶名,密碼等敏感信息
  4. 小明將加密信息發送給網站A,這個流量被小紅截獲
  5. 由於密文是用小紅的公鑰加密的,小紅用對應的私鑰解密,獲得小明的密碼,攻擊完成

能夠看到僅僅是公私鑰仍是不能應對中間人的流量劫持,傳輸過程當中信息被截獲仍然會被破解。這個攻擊能成功的關鍵點就是小明拿到了錯誤的公鑰,因此須要一種機制來保證小明拿到正確的網站A公鑰,這個機制就是數字證書。數字證書說開了很簡單,他裏面核心東西就一個,就是網站A的公鑰。網站A將本身的公鑰放到數字證書裏面發送給小明,小明一看,這個公鑰是證書認證的,可信,就用這個了。即便小紅替換了公鑰,由於小紅的公鑰沒有證書認證,因此小明也能夠識別出這個假冒貨。json

那數字證書的安全性又是怎麼保證的呢,小紅再僞造一個數字證書不就好了嗎?這就要說到CA(CertificateAuthority)了,CA是頒發數字證書的機構,CA有本身的公私鑰。CA用本身的私鑰加密一個信息,這個信息就是網站A的公鑰,而後發送給用戶,用戶拿到這個信息用CA的公鑰解密,就拿到了正確的網站A的公鑰了。因此,數字證書其實就是CA私鑰加密過的網站公鑰。小紅沒有CA的私鑰,她就僞造不出來網站的數字證書了,也就無法替換小明拿到的公鑰了。因此,數字證書其實保證了網站公鑰的正確性,CA保證了數字證書的安全性瀏覽器

既然CA保證了數字證書的安全性,那誰來保證CA的安全性呢?假設有個東西X保證了CA的安全性,那誰來保證X的安全性呢?感受這個信任鏈條能夠無窮盡呢。。。現實中,CA的安全級別很是高,他的安全不只僅有技術手段,還有法律,物理措施等。反過來講,回到本文的主題,破解https,到這裏咱們其實有了第一個思路:黑掉CA!你就能夠將它名下全部證書的公鑰都替換成本身的,解密使用他證書的全部網站。安全

評論區有朋友提到,Charles能夠解密https,這個原理不就跟小紅攻擊小明的原理同樣嘛。Charles解密https的前提是你要安裝他的證書,安裝了他的證書,你其實就至關於信任了Charles這個假的CA。攻擊流程將前面的小紅換成Charles就好了。服務器

會話祕鑰

公私鑰的加密解密確實很安全,可是他的速度很慢,若是每條信息都這麼操做,會影響整個交流效率,因此當咱們跟https創建鏈接後,經過公私鑰交換的信息其實只有一個:會話祕鑰。會話祕鑰不是非對稱加密,而是對稱加密。對稱加密在某些影視做品中很常見:某主人公獲得一個藏寶圖,苦於藏寶圖是密碼寫的,看不懂,百般無奈下,想起祖傳的某某書籍,拿到一對照,那本書恰好能夠解密藏寶圖密碼。那這本書其實就是密碼本,二戰中不少信息加密就用的密碼本的方式,經過截獲密碼本獲取對方軍事情報的事情也很多。加密解密都用密碼本,其實就是用了同一個祕鑰,這就是對稱加密。用計算機領域的話來講,這個密碼本不就是一個hash函數嘛,這個函數將一個字符映射成另一個字符。舉個例子,咱們加密的hash函數就是將字符後移三位,a -> d, b -> e 這種,那"hello"就變成了:函數

h -> k
e -> h
l -> o
l -> o
o -> r

"hello"就變成了"khoor",那攻擊者只要知道了你這個算法,再反算回來,前移三位就解密了。因此對稱加密相對來講並不安全,可是,若是我能保證他的密碼本(也就是祕鑰)是安全的,對稱加密也能夠是安全的。那對稱加密的祕鑰怎麼保證安全呢?用公私鑰再加一次密啊!因此https鏈接後,公私鑰交換的信息只有一個,那就是對稱加密祕鑰,也就是會話祕鑰。對稱加密的算法就是一個hash函數,加密解密相對更快,這種設計是從效率的角度考慮的。

數字簽名

數字簽名其實很簡單,是用來保障信息的完整性和正確性的:

  1. 小明先將明文信息用摘要算法生成一個摘要,這個算法相似於MD5,SHA-1,SHA-2,就是一個不能反解的hash函數
  2. 小明用公鑰對這個摘要進行加密
  3. 小明將這個簽名附加在內容後面一塊兒發給服務端
  4. 服務端接收到簽名後,用私鑰解密出摘要
  5. 服務端對內容進行一樣的摘要算法,得出摘要
  6. 服務端算出的摘要若是跟簽名裏面的同樣,則內容完整,沒有被篡改

HTTPS握手流程

前面幾個知識點其實已經把https的關鍵點都講了,下面咱們來總結下https握手流程:

  1. 小明向網站A發起請求
  2. 網站A將CA數字證書返回給客戶端,證書裏面有網站A的公鑰
  3. 小明經過本身電腦內置的CA公鑰解密證書,拿到網站A的公鑰(CA公鑰內置在瀏覽器中)
  4. 小明生成隨機的對稱祕鑰,也就是會話祕鑰。會話祕鑰必定要客戶端生成,由於前面說了,這裏公私鑰只能保證客戶端發給網站信息的安全,公鑰加密的信息只有私鑰才能解開,私鑰網站藏起來了,因此其餘人拿到信息也解不開。可是若是網站生成會話祕鑰,用他的私鑰加密,那全部人都有公鑰,全部人都能解開了。
  5. 小明將會話祕鑰經過網站A的公鑰加密,發送給網站A
  6. 接下來網站A和小明使用會話祕鑰進行HTTP通訊

RSA算法

前面咱們提到過公鑰加密的信息用同一個公鑰也解不開,只能用私鑰解密,這其實就是非對稱加密的核心機密,下面咱們來說講這個機密是怎麼作到的,這其實就是RSA算法。RSA算法計算流程以下:

  1. 隨機選取兩個質數p和q
  2. 計算 n = pq
  3. 計算 φ(n) = (p-1)(q-1)
  4. 找一個與φ(n)互質的小奇數e,互質是指兩個數的公約數只有1
  5. 對模φ(n),計算e的乘法逆元d,即找到一個d,使下列等式成立:(e*d) mod φ(n) = 1
  6. 獲得公鑰:(e, n),私鑰: (d, n)
  7. 加密過程:c = (m^e) mod n, (c爲加密後的密文,m爲原文)
  8. 解密過程:m = (c^d) mod n

第七步說明下,m的e次方,m就是咱們發送的原文,能夠是文本,json,圖片,雖然形式多樣,可是在計算機裏面都是二進制01,因此能夠轉換成數字求次方。下面咱們找兩個數來試一下這個算法:

  1. 隨便選兩個質數23和61
  2. 計算 n = 23 * 61 = 1403
  3. 計算 φ(n) = (23-1) * (61-1) = 22 * 60 = 1320
  4. 找一個與φ(n)互質的小奇數e,咱們選7
  5. 計算乘法逆元d,我這裏算好的是 d =943。對乘法逆元感興趣的朋友能夠網上搜搜怎麼算,由於不是本文主題,我就不展開了。
  6. 獲得公鑰(7, 1403),私鑰(943, 1403)
  7. 咱們用公鑰隨便加密一個5試試,加密 c = (m^e) mod n = (5^7) % 1403 = 78125 % 1403 = 960
  8. 私鑰解密: m = (c^d) mod n = (960^943) % 1403 = 5,(960^943)這個數字超級大,通常計算器算不出來,JS計算更不行,我是用這個網站算的:https://defuse.ca/big-number-calculator.htm
  9. 再試試私鑰加密:c = (m^d) mod n = (5^943) % 1403 = 283
  10. 公鑰解密: m = (c^e) mod n = (283 ^ 7) % 1403 = 5

知道了算法,咱們就能夠來解答前面的那個問題了,爲何公鑰本身加密的數據本身還解不出來?注意看加密算法(m^e) mod n這是個模運算啊,模運算是不能反解的。好比5對4取模,5%4=1,可是反過來,知道x%4=1,求x。這個x能夠有無限個,5,9,13,17。。。因此即便你有公鑰(e,n),和密文c,你也不知道(m^e)到底取哪一個值,是反解不出來的,這就是非對稱加密的核心機密,私鑰加密同理,本身加密的本身也反解不出來。

RSA破解思路

所謂破解RSA,其實就是經過公開的信息推測出他藏起來的信息,具體來講就是已知公鑰(e, n)求私鑰(d,n),也就是求d。要求d,其實就是反解(e*d) mod φ(n) = 1,要反解這個式子,就必須知道φ(n),由於φ(n) = (p-1)(q-1),因此必須知道p和q。咱們知道n=pq,並且n是已知的,因此仍是有可能知道p和q的。因此破解RSA其實就是一句話:n是已知的,將n拆成兩個質數之積就好了。提及來簡單,作起來很是難!由於實際使用時,n很是大,如今好多地方用的n都是2048 bits甚至4096 bits,這個數字轉換成十進制也有幾百位上千位長,作個對比,JS整數最多支持53 bits。。。因此現實中有兩條路來破解RSA:

  1. 找出一個算法,可以高效的將大數n拆分紅兩個質數。惋惜目前數學界也還沒找到這個算法。
  2. 沒有好辦法就用笨辦法,窮舉,從2開始遍歷p, q,直到他們的乘積爲n爲止。聽說有人花了5個月時間算出了一個512 bits的n,而後人家早就換了祕鑰,RSA還升級到了1024 bits...

總結

  1. HTTPS其實就是HTTP+RSA+數字證書+會話祕鑰
  2. RSA實現了非對稱加密,可讓公鑰任意分發,私鑰即便丟失了,也能夠迅速換一對公私鑰。解決了對稱加密密碼本的漏洞。
  3. 數字證書保證了分發的公鑰不能被篡改。
  4. CA保證了數字證書的安全性。
  5. CA的安全性由誰保證是個玄學
  6. 會話祕鑰是對稱加密,目的是爲了加快加密解密速度
  7. RSA算法精髓:
    1. 加密使用模運算,徹底不能反解
    2. n取一個超大數,超出了數學界理論極限和計算機的工業極限
  8. 破解HTTPS三條路:
    1. 黑掉CA,將它名下證書的公鑰都換成你的,方法勿論。。。
    2. 數學之神附體,找到高效大數分解算法,分分鐘算出p,q
    3. 圖靈附體,研發出超快的量子計算機,秒秒鐘算出p,q
  9. 本身網站沒開https的趕忙回去開,記得找個靠譜的CA買證書

文章的最後,感謝你花費寶貴的時間閱讀本文,若是本文給了你一點點幫助或者啓發,請不要吝嗇你的贊和GitHub小星星,你的支持是做者持續創做的動力。

「前端進階知識」系列文章及示例源碼: https://github.com/dennis-jiang/Front-End-Knowledges

歡迎關注個人公衆號進擊的大前端第一時間獲取高質量原創~

QR1270

相關文章
相關標籤/搜索