Public-Key

為什麼 Web 服務傾向於使用預共享的密鑰而不是公鑰來進行客戶端身份驗證?

  • September 13, 2022

我曾經註冊過的每個 API 都會為您提供一個密鑰,然後您可以將其粘貼到您的應用程序中。他們知道鑰匙,你也知道。(一個例外可能是 VAPID for Web Push)。

為什麼會這樣?一些應用程序和協議已經為使用者提供了一個公鑰/私鑰對,並且只將公鑰儲存在使用者的數據庫行中。然後,使用者使用其相應的私鑰簽署請求,這些私鑰永遠不會離開設備。(沒關係,在 Web3 錢包中,您通常可以導出私鑰,我認為這是一個糟糕的設計決策,會導致各種網路釣魚和詐騙。)

現在,我知道對於加密,我們確實需要在有效負載旁邊發送一個對稱密鑰來解密它。但是對於簡單地對有效負載進行簽名,我們不能只對其進行雜湊處理並使用私鑰對雜湊進行簽名嗎?

我能想到的使用對稱密鑰的唯一理由有可怕的缺陷:

  • **機構。既然平台無論如何都在做這項工作,那麼知道對稱密鑰有什麼害處呢?**嗯,這有兩個問題。一是如果平台的數據庫被攻破,所有的秘密都會被洩露。其次是平台可能會冒充應用程序,假裝應用程序簽署了一些東西,而實際上它沒有。更改數據庫狀態是一回事,聲稱應用程序或使用者要求您這樣做是另一回事。
  • **量子電阻。當量子電腦能夠破解橢圓曲線密碼學等時,任何擁有足夠資源的人都可以模擬應用程序的請求。**嗯,這是真的,但到時候我們可以切換到使用 SPHINCS+,它也是基於散列,或者可能是基於格的密碼學。確實,我們需要時間來切換應用程序,但除非您正在建構分佈式協議,否則您可以通過簡單地更改平台來強制他們進行操作。
  • **舊版本的 PHP 不支持開箱即用的公鑰加密,我們不希望我們的使用者必須安裝自定義 PHP 擴展。**對於 Wordpress、Discourse 和其他旨在自託管的開源平台,我可以理解這一基本原理。但是現在所有的語言支持開箱即用。所以有什麼問題?另外,大多數 API 都是由中心化公司執行的,所以這不是問題。

簡而言之,我不明白為什麼 API 使用共享密鑰而不是其 API 客戶端的公鑰。

與其他人所說的一致,我也認為這不太正確:

如果平台的數據庫被入侵,所有的秘密都會洩露

伺服器應該儲存 API 密鑰的雜湊值,而不是 API 密鑰本身,就像我們使用密碼一樣。這樣一來,數據庫的洩漏將不允許攻擊者發出欺詐性的 API 請求(並且由於 API 密鑰是長且隨機的,因此任何體面的散列方案也無法用於暴力破解)。

我記得遇到的所有提供 API 密鑰的服務只允許您在最初生成密鑰時查看密鑰,而不是之後,這將支持它們以不可檢索的格式儲存的想法。

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