面試官:說說你對網路請求加密的理解?
在紙質合同中,由於簽名字跡的不可複製性,蓋章的唯一性以及紙質合同對塗改的防範措施(比如金額用大寫)可以保證上述兩點,從而具備法律效應,那麼PDF合同如何保障呢?兩個重要的概念就是數字簽名和數字證照。這項技術廣泛運用於檔案認證,資料傳輸等。
為了弄懂這些,我花了2天時間從加密演算法開始,到數字簽名和CA證照,最後再重新認識下https的原理。
這個也是面試官長問的題目,所以我也順便整理了下面試題
關注我,私信我【面試題】領取 面試專題
非對稱加密
加密我瞭解的不多,只知道有這麼兩種演算法:對稱加密和非對稱加密。
-
對稱加密:加密和解密的金鑰一樣,比如用123加密就是用123解密,但是實際中密碼都是普通資料在網際網路傳輸的,這樣一點密碼被中間人擷取並破解,加密直接被攻破。
-
非對稱加密:把金鑰分為公鑰和私鑰,公鑰是公開的所有人都可以認領,私鑰是保密的只有一個人知道。假設A要傳送一 封Email給B,他不想讓任何其他人在傳輸中看到Email的內容,做法就是使用B的公鑰對Email加密,只有B的私鑰能夠解密(B的私鑰唯一性保證信件不會洩露)。
某天出意外了,有駭客冒充A給B傳送Email,並且也用B的公鑰加密,導致B無法區分這封郵件是否來自A。怎麼辦?此時A可以用自己的私鑰加密,那麼B收到郵件後如果用A的公鑰可以解密郵件,那麼證明這封信肯定來自於A。
OK,透過這個例子我想你們基本明白非對稱加密了!我總結了下面幾點:
-
公鑰的作用:對內容本身加密,保證不被其他人看到。
-
私鑰的作用:證明內容的來源
-
公鑰和私鑰是配對關係,公鑰加密就用私鑰解密,反之亦然,用錯的金鑰來嘗試解密會報錯。
數字簽名
接著聊上面發郵件的例子,假設A用自己的私鑰對Email加密傳送,這存在下面問題:
對檔案本身加密可能是個耗時過程,比如這封Email足夠大,那麼私鑰加密整個檔案以及拿到檔案後的解密無疑是巨大的開銷。
數字簽名可以解決這個問題:
1.A先對這封Email執行雜湊運算得到hash值簡稱“摘要”,取名h1
2.然後用自己私鑰對摘要加密,生成的東西叫“數字簽名”
3.把數字簽名加在Email正文後面,一起傳送給B(當然,為了防止郵件被竊聽你可以用繼續公鑰加密,這個不屬於數字簽名範疇)
4.B收到郵件後用A的公鑰對數字簽名解密,成功則代表Email確實來自A,失敗說明有人冒充
5.B對郵件正文執行雜湊運算得到hash值,取名h2
6.B 會對比第4步數字簽名的hash值h1和自己運算得到的h2,一致則說明郵件未被篡改。
看完這個過程,是不是覺得數字簽名不過如此。其實就是利用演算法(不一定是非對稱演算法)對原文hash值加密,然後附著到原文的一段資料。數字簽名的作用就是驗證資料來源以及資料完整性!解密過程則稱為數字簽名驗證。
不過先彆著急,我在梳理數字簽名流程時候有下面幾點疑惑,不知你也是否一樣?
1.如果中間人同時篡改了Email正文和數字簽名,那B收到郵件無法察覺啊。
答案:數字簽名的生成需要對方私鑰,所以數字簽名很難被偽造。萬一私鑰洩漏了呢,不好意思,你私鑰都能弄丟了那這篇文章當我白寫。(私鑰絕對保密不參與傳輸)
2.公鑰是公開的並且可以自行匯入到電腦,如果有人比如C偷偷在B的電腦用自己公鑰替換了A的公鑰,然後用自己的私鑰給B傳送Email,這時B收到郵件其實是被C冒充的但是他無法察覺。
答案:確實存在這種情況!解決辦法就是數字證照,一環套一環請接著看。
數字證照
上面第2點描述的安全漏洞根源在哪?就是A的公鑰很容易被替換!那麼數字證照是怎麼生成的呢?以及如何配合數字簽名工作呢?
1.首先A去找”證照中心”(certificate authority,簡稱CA),為公鑰做認證。證照中心用自己的私鑰,對A的公鑰和一些相關資訊一起加密,生成”數字證照”(Digital Certificate):
2.A在郵件正文下方除了數字簽名,另外加上這張數字證照
3.B收到Email後用CA的公鑰解密這份數字證照,拿到A的公鑰,然後驗證數字簽名,後面流程就和圖1的流程一樣了,不再贅述。
和數字簽名一樣我在梳理這個流程時有下面幾點疑惑:
假設數字證照被偽造了呢?
答案:是的,傳輸中數字證照有可能被篡改。因此數字證照也是經過數字簽名的,是不是感覺很繞貌似陷入了“雞生蛋蛋生雞”,我保證這是最後一個蛋- - !上文說道數字簽名的作用就是驗證資料來源以及資料完整性!B收到郵件後可以先驗證這份數字證照的可靠性,透過後再驗證數字簽名。
要是有1萬個人要給B發郵件,難道B要儲存1萬份不同的CA公鑰嗎?
答案:不需要,CA認證中心給可以給B一份“根證照”,裡面儲存CA公鑰來驗證所有CA分中心頒發的數字證照。CA中心是分叉樹結構,類似於公安部->省公安廳->市級派出所,不管A從哪個CA分支機構申請的證照,B只要預存根證照就可以驗證下級證照可靠性。
如何驗證根證照可靠性?
答案:無法驗證。根證照是自驗證證照,CA機構是獲得社會絕對認可和有絕對權威的第三方機構,這一點保證了根證照的絕對可靠。如果根證照都有問題那麼整個加密體系毫無意義。
舉個例子
上面一直在說虛擬場景,下文舉個實際例子看看數字簽名+數字證照如何驗證檔案的來源,以及檔案的完整性。比如下載檔案:我們開發中一般是服務端給檔案資訊加上md5,客戶端下載完成後校驗md5來判斷檔案是否損壞,這個其實就是簡單的校驗機制,而很多正規企業比如google都會給官方軟體簽署數字簽名和證照,而windows已經預置了很多CA根證照:
然後看下我之前從網上下載的Chrome.exe,右鍵屬性,透過滑鼠點選一步驗證:
Google Inc就是google從CA中心申請的數字證照。這樣看來,這個軟體確實來源於google官方,並且檔案完整。接下來我乾點壞事,用notepad開啟這個exe檔案並且篡改裡面的內容(修改二進位制資料,09 改為33),儲存:
再看下數字簽名還正常嗎?
檔案被篡改導致數字簽名無效,數字證照沒有問題。
https介紹
數字簽名和數字證照可以用於檔案,當然也能用於html網頁資料。本人沒有https相關開發經驗,故不做深入探討只是簡單介紹下。
http的安全缺陷:
-
1.無法驗證服務端的身份
-
2.無法保證資料完整性
-
3.無法保證資料傳輸不被竊聽
而https就是專門解決這三個問題,https使用數字簽名+數字證照解決了前2個問題,很多大型網站比如baidu.com都會採用https協議,網址左側會出現綠色加鎖標識:
點選可以檢視證照,另外瀏覽器都會內建CA根證照,來對這些網站的伺服器證照進行校驗。
然後,再用SSL協議對傳輸通道加密,保證資料傳輸不被竊聽,這個SSL加密原理分為很多步驟不在本文討論範圍。
so,問題來了
你公司專案的網路請求是用http還是https? 歡迎在評論區留言探討!
BATJ、位元組跳動面試專題,演算法專題,高階技術專題,混合開發專題,java面試專題,Android,Java小知識,到效能最佳化.執行緒.View.OpenCV.NDK等已經上傳到了的我的GitHub
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2672996/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 面試官:說說你對react生命週期的理解面試React
- 面試官:說說你對ThreadLocal的瞭解面試thread
- 說說你對請求數和併發數的理解
- 【Java面試】說說你對Spring MVC的理解Java面試SpringMVC
- 面試官:你剛說你喜歡研究新技術,那麼請說說你對 Blazor 的瞭解面試Blazor
- 說說你對this的理解
- 面試官:說說你對NoSQL的瞭解,為什麼要有NoSQL面試SQL
- 【大廠面試07期】說一說你對synchronized鎖的理解?面試synchronized
- 面試官:說一下你常用的加密演算法面試加密演算法
- 面試官:說說你對Fork/Join的平行計算框架的瞭解?面試框架
- 騰訊面試官:兄弟,你說你會Webpack,那說說他的原理?面試Web
- 面試題:說說你對ZooKeeper叢集與Leader選舉的理解?面試題
- 說說你對JSBridge的理解JS
- 說說你對UML的理解
- 面試官:你說你精通 Docker,那你來詳細說說 Dockerfile 吧面試Docker
- 阿里一面,說說你對Mysql死鎖的理解阿里MySql
- 說說你對績效的理解?
- PHP面試:說說你理解的二叉樹吧PHP面試二叉樹
- 面試官:說說Java 原子類面試Java
- W3C是什麼?請說說你對它的理解
- 請說下你對__proto__和prototype的理解
- 面試官:說說CountDownLatch,CyclicBarrier,Semaphore的原理?面試CountDownLatch
- 面試官:說說Java物件的組成面試Java物件
- 說說你對前端架構的理解前端架構
- 說說你對作用域鏈的理解
- 說說你對z-index的理解Index
- 說說你對`<meta>`標籤的理解
- 說說你對時間戳的理解時間戳
- 說說你對盒子模型的理解?模型
- 面試官:說說你知道的幾種負載均衡分類面試負載
- 面試官:說說雙親委派模型?面試模型
- 說說你對瀏覽器的關鍵渲染路徑的理解瀏覽器
- 你說說對Java中SPI的理解吧Java
- 你有聽說過“分詞”嗎?說說你對它的理解分詞
- 面試官:說說降級、熔斷、限流面試
- 面試官:說說你之前負責的系統,QPS 能達到多少?面試
- 面試官:說說反射的底層實現原理?面試反射
- 面試官:說說Java物件的四種引用方式面試Java物件