Password-Based-Encryption
密碼所有權的簡單證明
我想在網路瀏覽器上做一個完全無伺服器的 p2p 聊天應用程序,所以它甚至沒有數據庫來儲存帳戶,但我仍然希望在它上面有某種身份系統(使用者可以在這個聊天中擁有使用者名只有他們可以使用)。為了實現這一點,我開始研究一個有點讓人聯想到旅行碼的身份驗證系統,用於各種圖像板上(我不知道這是否真的是要走的路,我願意接受新的建議):
- 使用者輸入密碼,
- 應用程序使用單向函式從該密碼生成公共資訊(例如雜湊或公鑰),
- 然後使用tripphrases、proquint或identicons等系統將此公共資訊轉換為對人類有意義的標識符。
Examples: "MyPassword" --(CRC32)--> "7d586a02" --(proquint)--> "hotig-muhig-donig-fubag" "MyPassword" --(MD5)--> "48503dfd58720bd5ff35c102065a52d7" --(tripphrase)--> "interleave my calcifugous ghost"
在 p2p 系統中使用散列作為標識符(即零信任且沒有中央事實來源)的問題在於,沒有什麼可以阻止某些使用者使用他們想要的任何標識符編寫消息,同時假裝他們通過在本地散列密碼獲得了該標識符,就像協議說的那樣。因此,我想要的是一種在不洩露密碼的情況下證明身份所有權的方法。我只能想到一種方法來解決這個問題:
愛麗絲輸入密碼,
應用程序從此密碼派生一個私鑰/公鑰對,
公鑰用於生成 Alice 的人類有意義的標識符,
Bob 想要驗證 Alice 的身份:
- Bob 向 Alice 發送一個挑戰(即一個隨機數),
- 愛麗絲用她的私鑰加密隨機數,
- Alice 將結果發回給 Bob,
- Bob 使用 Alice 的公鑰解密結果(可以通過將 Alice 的標識符轉換回公鑰來獲得),
- 如果解密後的號碼與之前發送的號碼相同,那麼 Alice 確實擁有密碼,否則 Alice 就是在謊報自己的身份。
但我想知道是否有比這更簡單的協議來解決我的問題。最好,我想完全避免使用公鑰密碼術。由於我做這個項目只是為了好玩,我並不真正關心以下幾點:
- 密碼的強度,
- 如果兩個使用者使用相同的密碼並因此獲得相同的標識符,
- 如果其他人知道密碼的雜湊值或關聯的公鑰,這清楚地給出了秘密密碼的資訊,那麼零知識證明就沒有必要了。
任何想法?
謝謝您的幫助。
您可以使用標準簽名方案。使用者將輸入密碼,並收到他們的私鑰和相關的使用者名。然後,為了發布消息,他們簽署消息並廣播消息、使用者名和簽名。其他使用者將使用者名轉換為公鑰,然後驗證簽名。
這與比特幣處理身份危機的方式相同:將消息綁定到密鑰而不是真人。