是否可以在沒有公鑰的情況下證明公鑰雜湊的所有權?
我正在建構一個系統,我希望使用者在其中指定一個錢包的公鑰雜湊值,在出現小費、退款和/或其他需要向他們發送價值的情況下,他們可以控制該雜湊值。
從那裡,我想進一步提供一個功能,讓使用者驗證他們擁有這個散列地址。
如果我理解正確,他們可以通過簽署我發送給他們的消息來證明這一點,然後他們可以將簽名連同公鑰一起發回給我。
但是,我也明白公開您的公鑰被認為不太理想。
因此,我很好奇是否有某種解決方案可以讓我僅根據散列地址驗證所有權,而無需使用公鑰。
我想由於這個驗證過程是暫時的,不會永久儲存在公共區塊鏈(或其他任何地方)中,因此它不會對場景造成潛在危害(或者更確切地說,對使用者來說更“值得信賴”)。但是,我希望盡可能注意他們的隱私和安全,並為他們提供機會,以最不具侵入性的方式驗證他們對這個散列地址的所有權。
在使用者界面的某處簡單地聲明此驗證過程不會以任何方式儲存公鑰是否足夠?這一切都假設一個 HTTPS 連接,但當然風險在於,由於不良行為者會知道正在傳輸公鑰,它會打開另一個可能的攻擊向量。
此外,我對這里首選/已知的其他方法以及以優雅方式解決此問題的其他站點和/或服務的任何範例非常感興趣。
簡單回答是不。
散列算法被認為是一種單向函式。如果可以從散列中重新創建公鑰,這意味著散列算法被破壞。
但是,您可能會發現有一個方面很有用。對於消息簽名,比特幣使用自定義編碼(與交易中的 DER 編碼簽名相比)。
給定自定義編碼消息簽名、消息和公鑰雜湊,您可以驗證簽名是否正確。但是請注意,這是因為自定義編碼簽名支持公鑰恢復。因此,這導致與僅提供公鑰相同的安全性方面,但好處是使用者不需要專門將公鑰轉移給您。
如果您想測試自定義編碼簽名,它們將由比特幣核心客戶端中的“signmessage”函式返回。然後可以通過“verifymessage”功能或多種線上工具進行驗證,例如: https ://blockexplorer.com/messages/verify