Transactions

使用 AWS CloudHSM 簽署交易

  • April 2, 2021

有人知道如何正確使用 AWS CloudHSM 簽署乙太坊交易(Keccak256)嗎?

好的,

因此,當我們(我和 ShaneT)實施硬體簽名(專門儲存在 AWS CloudHSM 上的私鑰)時,我們學到了很多東西。希望這可以為您提供有關如何實現它的指南。不幸的是,我不能直接共享程式碼,因為它是我公司的 IP。

是我們第一次在主網上使用 AWS CloudHSM 進行的實際交易 :)

注意事項:

  • 大多數 HSM 產品支持專有介面和稱為 PKCS#11 的通用介面。PKCS#11 只是與 HSM 對話的標準方式的一個花哨術語。
  • AWS 支持 prop 和 PKCS#11 互動,您應該使用 PKCS#11。
  • Keccak256 與 HSM 無關,事實上 AWS 支持SECP256k1曲線,允許它簽署 ETH 交易。
  • ECDSA(橢圓曲線數字簽名算法)大於 ETH 或 BTC。即,您可能會遇到 AWS CloudHSM 返回有效ECDSA 簽名的障礙,但它們是無效的乙太坊交易,例如,如果 HSM 返回具有**高 S**值的 sig。
  • Web3 中存在許多庫,但是 JS 是主要語言,不要與之抗爭 :)

實施指南:

  • 仔細遵循指南以設置基礎架構/HSM。如果你跳過一點點,你就會得到rekt。ps 我用的是 Amazon Linux 2,比較簡單。
  • 為 JS PKCS#11使用這個(石墨烯)庫,我嘗試了所有這些都是使用 imo 的。
  • 如果您可以使用ecrecover, r,sv值來計算正確的 Eth 地址,那麼您已經完成了。

簽名步驟:

  1. 打開與 HSM 的連接,使用 SECP256k1 創建一個公鑰私鑰對。

  2. 檢索該對的公鑰併計算對應的 ETH 地址。

  3. 你現在有一個 Eth 地址,HSM 擁有它的私鑰。

4)像這樣創建一個交易:

 const txParams = {
   nonce: '0x' + nonce.toString(16),
   gasPrice: '0x09184e72a00',
   gasLimit: '0x27100',
   to: '0x4D8519890C77217A352d3cC978B0b74165154421', 
   value: web3.utils.toHex(web3.utils.toWei('0.01', 'ether')),
   chainId: 4
 };

5)使用私鑰請求籤名的句柄,請記住您正在簽署有效負載的雜湊:

 const sign = session.createSign('ECDSA', yourPrivateKey);
 const sig = sign.once(msgHash);
  1. 請記住,ECDSA sig的第一個rs第二個是計算值和代表chainID 的乙太坊綁定概念。32 bytes``v
 const rs = {
   r: sig.slice(0, 32),
   s: sig.slice(32, 64)
 };
  1. CRITICAL:由於EIP-2,您必須循環直到獲得 ECDSA sig 且其s值位於曲線右側,否則將是錯誤的 Eth tx。

即在哪裡s < curve.n/2

if (s > curve.n / 2) id = id ^ 1; // Invert id if s of signature is over half the n
  1. 假設一切都正確實施,您應該能夠用來ecrecover檢查 HSM 創建的 sig 的有效性。
if (ethUtil.ecrecover(msgHash, 27, rsvOdd.r, rsvOdd.s).toString('hex') === yourETHPublicKeyString)

如果這一切都很好,那麼你已經做到了!您現在可以送出您的 tx,它應該被開採。

這聽起來很棘手,但它是完全可行的。

問題,只是喊。

引用自:https://ethereum.stackexchange.com/questions/73192