Public-Key

如何通過 Internet 安全可靠地獲取公鑰?

  • June 30, 2019

我剛剛決定開始學習所有關於 PKI 的知識,但我遇到了一個看似悖論的問題。

從伺服器或 CA 獲取公鑰時,我們如何確保我們收到的公鑰沒有被中間人攔截和修改?

驗證數字簽名不需要公鑰嗎?如果是這樣,該公鑰是否也需要具有數字簽名以便我們可以驗證其合法性?在我看來,這幾乎肯定會導致一個永無止境的數字簽名鏈。

這對我來說是一個令人難以置信的莫名其妙的概念,一個我自己無法推理出來的概念。如果有人能指出我理解中的任何缺陷,我將不勝感激。

我讀過一些類似的問題,一個是:發送方如何獲得接收方的公鑰? 但是,對我來說,這並不能真正解釋我們如何從用於獲取公鑰的通道中消除中間人攻擊。

謝謝大家。

TLDR;我們如何才能從用於獲取公鑰的渠道中消除中間人攻擊?

在公鑰基礎設施中,可以通過兩種方式信任公鑰:或者因為它是由您信任的證書頒發機構簽名的,或者因為您已經在受信任的公鑰列表中擁有它。這就是簽名鏈結束的地方:在預先信任的公鑰列表中。

這些預先信任的公鑰通常稱為“根 CA”或“信任庫”。它們隨作業系統、應用程序或配置一起提供。

有時,作業系統/應用程序/配置可能有自己的一組特殊用途的根 CA,這些根 CA 是通過安裝作業系統/應用程序/配置的作業系統提供的不同 PKI 獲得的。這可能與執行依賴 PKI 的應用程序所在的系統不同。例如,如果您在 PC 上下載嵌入式設備的韌體,則瀏覽器使用的 PKI 可以保證韌體映像的真實性。您信任嵌入式設備上 PKI 的根 CA,因為它們是您信任的韌體映像的一部分。

但歸根結底,它歸結為您信任的公鑰,不是因為它具有由證書頒發機構製作的數字簽名,而是因為您通過您信任的方式從您信任的人那裡獲得了它。通常它也是提供執行簽名驗證的程式碼的同一實體,無論如何您都必須相信這一點:如果驗證簽名的程式碼可能接受無效簽名,那麼實際上誰沒有製作這些簽名並不重要。並且通常它也是提供硬體的同一實體,同樣,如果硬體沒有正確執行簽名驗證,那麼程式碼和數據是否良好都無關緊要。

例如,如果您購買的電腦預裝了包含支持 HTTPS 的 Web 瀏覽器的作業系統,那麼您信任它來驗證密鑰的原因與密碼學無關。密碼學是瀏覽器驗證連接真實性的方式,而不是信任它這樣做的原因。

這實際上是密碼學的普遍現象:密碼學實際上並沒有從頭開始創建安全屬性。密碼學是一種擴展安全屬性以覆蓋更多領域的數學方法。例如,僅靠加密不能使數據保密:加密所做的只是將密鑰的機密性擴展到數據的機密性。數字簽名將私鑰的機密性擴展到數據的真實性。同樣,散列不保證其自身數據的完整性,而是將散列的完整性擴展到數據的完整性。從根本上說,必須有一些非加密方法來保護密鑰或散列。

我沒有在這個網站上找到重複的問題,但是這已經在 Security Stack Exchange 上多次討論過,特別是:

引用自:https://crypto.stackexchange.com/questions/71661