使用 web3.js 驗證地址的歸屬權

材料

思路

  1. 生成一個隨機字符串
  2. 讓用戶用私鑰加密這個字符串
  3. 平臺使用公鑰解密這個字符串,核對和步驟 1 生成的字符串一致, 則通過, 不一致則認為失敗

步驟

我需要驗證一個用戶對這個地址的所有權。 思路是 使用 web3.eth.sign 函數(shù), 讓用戶用私鑰簽名一段字符串hello world, 然后用公鑰對字符串進行解密, 如果解密后的字符串是hello world, 則認為用戶對該地址有所有權。

簽名

我使用 web3.eth.sign 函數(shù), 對 hello world 進行簽名, 得到一個 字符串

web3.eth.sign("0xec7a2d8FcBc0BAc118c23F9faA122ff833fe048a",web3.sha3("hello world"),function(error,result){console.log(result);});
 

0xd7d9614315e4b5c35d1ac26f41b2d9c6a217fb4fabb5aa343938324351b6c0ea5fbc60562a56df03e9da71a143fd753832c5ead2d8ad1aaa4ee6974f3f05cb491b

注意點

  1. web3.eth.sign 接受的第二個參數(shù), 需要用 web3.sha3 進行 hash 一下。

解密

之后,我要去驗證這個字符串可以用公鑰解密, 我發(fā)現(xiàn) web3.js 0.2x.x 沒有提供這個接口。在 1.0.0 的文檔中找到了 web3.eth.accounts.recover 方法。 然而 metamask 并不支持
https://web3js.readthedocs.io/en/1.0/web3-eth-accounts.html#recover

其他方法

找到的其他方法是
https://github.com/ethereumjs/ethereumjs-util/blob/master/docs/index.md#ecrecover
通過 esrecover 方法,

通過 簽名后的字符串,算出公鑰地址。 如果一致, 則認為成功。

ecdsa 接受4個參數(shù), 分別是 msgHash 和 v,r,s , 其中 msgHash 就是你加密的字符串, v,r,s 可以通過 加密后的字符串計算出來。

如何計算 v,r,s 參考 這里
https://ethereum.stackexchange.com/questions/2660/how-can-i-verify-a-signature-with-the-web3-javascript-api

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容