由於HTTPS涉及到不少加密相關的知識,因此須要先了解這些基礎才能更好的理解HTTPS面試
hash算法是指把任意數據轉換成指定⼤大⼩小範圍(一般很⼩小,例例如 256 字節之內)的數據,轉換後的數據稱爲原數據的摘要
或者指紋
,不能經過hash值獲得元數據。算法
常見的hash算法有SHA1,SHA256,MD5
等瀏覽器
在網上下載文件的時候,除了文件自己一般還會看到這樣一段信息安全
這個SHA1指的是利用的是SHA1這種hash算法,後面的值就是對這個文件進行SHA1取值後的摘要,下載文件後咱們對文件進行一次hash(網上隨都就能找到這種工具),而後和這個值對比,若是一直則說明文件沒有被篡改過。網絡
加密起源於古代戰爭,雙方通訊的雙時候爲了防止重要信息泄露,發送的一方用祕鑰把信息用某種規則轉化成別人沒法看懂的數據,獲得的數據稱爲密文,這個轉化過程稱爲加密。接收方獲得密文後,用相同的祕鑰用跟加密過程徹底逆向的方式把密文還原獲得本來的數據,這個過程稱爲解密併發
對稱的意思是加密和解密過程用的祕鑰相同的,要想接收方能解密發送方的密文,只有把祕鑰告訴對方,可是網絡上傳輸是沒辦法保證傳輸祕鑰的安全的,一旦祕鑰被截獲,加密通訊就失效了,因此對稱加密是不安全的 工具
你可能會想,我要用對稱加密的話,加密算法是什麼,密鑰又從哪裏來啊,別擔憂,如今已經有不少對稱加密算法了,密鑰生成、加密過程都已經實現了,咱們只要調用就好了網站
經典的對稱加密算法有DES
(56 位密鑰,密鑰過短⽽而逐漸被棄⽤用,AES
(128 位、192 位、256 位密鑰,如今最流⾏)編碼
非對稱是指加密和解密過程用的祕鑰是不一樣的。具體方式是通訊雙方各生成一對祕鑰,即公鑰和私鑰,公鑰是能夠公開的,私鑰是保密的。加密
非對稱加密的公鑰和私鑰的有下面的特色
通訊時,發送的一方用對方給的公鑰進行加密,接受的一方用本身保存的私鑰進行解密,這樣即便有第三方截獲了密文也不能破解,由於沒有私鑰
舉個不恰當的例子來理解一下這個過程
小明要和小紅進行加密通訊 小明說:小紅,我要跟你說句話,可是不能讓別人看到 小紅:好的,這是個人公鑰,你拿去,把你要說的話加密就能夠了 小明:"我愛你"-->(用小紅給的公鑰加密)--->「@#@#$$」 小紅獲得小明發送的密文,用本身的私鑰解密,"@#@#$$"-->(用本身的私鑰解密)--->「我愛你」 小紅:討厭
跟對稱加密算法同樣,目前也有不少成熟非對稱加密算法,生成公鑰私鑰、加密解密都幫咱們作好了,常見的非對稱加密算法有RSA
,DSA
,橢圓曲線算法
。
看了上面的例子,你可能會以爲「嗯,用非對稱加密通訊果真很安全「,可是聰明的你再仔細一想,「不對啊,若是騙子C冒充B給A一個本身的公鑰,A獲得公鑰後覺得這個公鑰就是B的,就用這個公鑰去加密,而後C拿到密文後就能夠用本身的私鑰解密不就獲得A發送的信息了嗎「。
humm,確實是這樣的,非對稱加密雖然保證了密文不會被破解,但並不能識別假裝和篡改
。這就是著名的中間人攻擊,那怎麼解決呢?這就須要用到數字簽名
了
數字簽名,是非對稱加密的一種應用。一般非對稱加密是用公鑰加密用私鑰解密,數字簽名就是反過來用,即用私鑰對數據加密
,這個過程稱爲簽名
,而後用公鑰對證書進行解密
,這個過程稱爲驗證
。
那麼數字簽名到底有什麼做用呢
這個過程可能有點抽象,我畫了一個圖來讓你更容易看懂,若是不明白什麼是hash計算的同窗,能夠先跳到對應部分看一看
emmm?數字簽名好像是挺厲害的,那咱們來試想一下這種狀況,仍是上面的ABC例子,C用本身的公鑰對本身的公鑰加密生成公鑰簽名
,併發公鑰和公鑰簽名都發給A,說本身就是B,不信你用公鑰接解密獲得的公鑰跟我發給你的是一致,A一式,果真同樣,而後就用這個公鑰加密傳信息,結果是A仍然被騙了。這個例子中的難點如今變成了:簽名依然能夠僞造,而簽名又是用公鑰來解的,A沒有辦法去驗證這個簽名究竟是不是來自B
那麼,怎麼證實公鑰確實來自B,怎麼能防止簽名被僞造呢?這就須要一個權威機構來作擔保人了,舉一個現實中的例子
你去面試 面試官:那個學校畢業的呀? 你:北大 面試官:北大青鳥? 你:.... 這是個人畢業證書 面試官:畢業證書也有造假的 你:.... 這是學信網,不信本身去查 面試官:哇,大佬何時來上班?
能夠看到,學信網就是那個權威機構,它能夠證實你的畢業證書確實是屬於你的而且是真實的,不是僞造的。
回到上面的問題,B爲了證實本身的真實性,就須要找"證書中心"(certificate authority,簡稱CA)作認證,具體過程以下
1.提交本身的公鑰
,註冊地址,公司能信息給CA 2.CA審覈後,用它本身的私鑰
對這些信息簽名,生成一個簽名文件(也叫證書)
返回 3.須要加密通訊的時候,帶上本身的公鑰簽名
和CA頒發的證書(
即本身的公鑰簽名+CA證書) 4.由於CA的公鑰是公開的,只要用它的公鑰解開了證書,說明該證書確實是CA頒發認證的,而後用發送發的公鑰去解開公鑰簽名,再跟證書中的公鑰對比,若是一致就證實了發送發的真實性。
這個過程可能比較繞,咱們依然用上面的例子再來梳理一下
- B爲了證實本身的真實性,提交了本身的公鑰和其餘信息給CA,
- CA機構認證後用CA的私鑰對B提交公鑰信息進行加密,生成了簽名文件交給B
- B爲了向A證實本身的真實性,先對本身的公鑰簽名,而後把CA頒發的證書+公鑰簽名一塊兒發給A
- A用CA的公鑰嘗試解密證書,若是能解開,說明證書確實是CA頒發的,而後拿出證書中的B公鑰嘗試解密公鑰簽名,若是能解開而且簽名中的公鑰和證書中的公鑰相同,就證實B公鑰的真實性
理解了上面的概念,咱們來看一看瀏覽器的證書驗證過程,你也能夠本身驗證一下,打開一個HTTPS網頁,點擊左上角的小鎖圖標
點擊證書
,就能清楚的看到該網站申請的證書信息
當訪問HTTPS網站的時候,瀏覽器會取出內置的CA公鑰,去驗證網站證書,若是驗證不經過,就會提示網站證書異常,讓用戶確認是否繼續訪問,驗證經過就開始後續的通訊
把數據轉換成另一種格式,而且還能轉換回來,不損失信息
一種編碼方式,把任意二進制數據轉化成一段字符串數據,每一個字符都有64中可能性,