Diffie-Hellman
ECDH 可以用於身份驗證嗎?
使用 ECDH 進行質詢響應身份驗證是否安全,伺服器密鑰是臨時的?
目標是伺服器不儲存敏感數據(散列),並允許客戶端在需要時使用額外的安全性(例如生成密鑰並將其儲存在智能卡中並跳過密鑰派生)。
- 客戶端使用強雜湊算法從密碼中獲取私鑰(類似於使用密碼的比特幣地址生成器)
- 伺服器生成密鑰並發送其(臨時)公鑰和質詢字元串
- 客戶端必須回復挑戰,使用共享密鑰加密
- 伺服器檢查解密響應是否產生挑戰
假設
- 已建立安全通道
- 伺服器儲存了客戶端的公鑰
客戶端使用強雜湊算法從密碼中導出私鑰
伺服器儲存了客戶端的公鑰
所以伺服器有一個密碼的雜湊值。這違背了您的目標,即伺服器沒有密碼雜湊。您所做的就是製作自己的密碼散列函式。
密碼雜湊是從密碼確定性派生的任何值(和鹽,除非你做錯了)。在密碼雜湊計算中增加一個私鑰到公鑰計算的步驟就是:增加一個步驟。這不是一個特別有用的步驟:如果是,標準密碼散列函式就可以了。由於每個私鑰都映射到不同的公鑰,因此這本身並不是一個有害的步驟,但對安全性沒有幫助。
您對協議的描述缺少伺服器儲存鹽的步驟(設置密碼時隨機生成)並將其作為質詢的一部分發送給客戶端。如果你不使用鹽,你的方案很容易受到彩虹表的攻擊,這使得破解使用相同雜湊算法儲存的多個密碼更加有效。
無法避免在伺服器上儲存密碼雜湊。伺服器如何知道客戶端知道密碼?它需要有足夠的資訊來區分正確的密碼和其他輸入。這正是攻擊者進行暴力密碼搜尋所需的資訊。對於密碼身份驗證,您可以做的最好的事情就是使這種蠻力搜尋盡可能困難。您提出的方案對此無濟於事。
如果客戶端除了密碼之外還有一個(強的、隨機生成的,因此普通人不可能記住的)秘密值,那麼就有可能設計一種方案,使伺服器即使通過蠻力也無法重建密碼。(我不會冒險在這個答案中詳細說明這樣的方案。)