詳解私鑰、密碼、keystore和助記詞

文章以及資料(開源):github地址

密碼

首先明白密碼不是私鑰,它是在創建賬戶時候的密碼(注意可以修改)。密碼在以下情況下會使用到:

  1. 作爲轉賬的支付密碼
  2. 用keystore導入錢包的時候需要輸入的密碼,用來解鎖keystore的

私鑰

私鑰由64位長度的十六進制的字符組成,比如:0xA4356E49C88C8B7AB370AF7D5C0C54F0261AAA006F6BDE09CD4745CF54E0115A一個賬戶只有一個私鑰且不能修改,。通常一個錢包中私鑰和公鑰是成對出現的,有了私鑰,我們就可以通過一定的算法生成公鑰,再通過公鑰經過一定的算法生成地址,這一過程都是不可逆的。私鑰一定要妥善保管,若被泄漏別人可以通過私鑰解鎖賬號轉出你的該賬號的數字貨幣。

keystore

Keystore常見於以太坊錢包,它是將私鑰以加密的方式保存爲一份 JSON 文件,這份 JSON 文件就是 keystore,所以它就是加密後的私鑰。Keystore必須配合錢包密碼才能使用該賬號。

助記詞

私鑰是64位長度的十六進制的字符,不利於記錄且容易記錯,所以用算法將一串隨機數轉化爲了一串12 ~ 24個容易記住的單詞,方便保存記錄。注意:

  1. 助記詞是私鑰的另一種表現形式
  2. 助記詞可以獲取相關聯的多個私鑰,反過來私鑰沒法獲取助記詞。

要弄清楚助記詞與私鑰的關係,得清楚BIP協議,是Bitcoin Improvement Proposals的縮寫,意思是Bitcoin 的改進建議,用於提出 Bitcoin 的新功能或改進措施。BIP協議衍生了很多的版本,主要有BIP32、BIP39、BIP44。

以太坊對BIP的支持

BIP是用於提出 Bitcoin 的新功能或改進措施,那麼對於以太坊來說如何支持呢?

  • 以太坊在EIPs/issues/84中討論,是否遵循 BIP32 和 BIP44,社區裏提出來很多有意思的觀點,比特幣是基於 UTXO 的,所以可以使用 HD 錢包(BIP32)爲每個交易分配一個新地址,以保護您的隱私。然而,以太坊是基於帳戶,每個帳戶都有一個地址,BIP 是比特幣的提案,而且比特幣的數據結構的設計是圍繞改變地址的想法構建的,BIP 的一些提案可能並不適合以太坊。以太坊的模式和比特幣UTXO 不同,以太坊轉賬不能改變地址,如果在以太坊上實現 UTXO ,用戶還必須簽名兩個交易以將餘額的一部分發送到一個地址,將餘額的一部分發送到第二個地址 - 這將使成本增加一倍,而且第二個交易可能不會在同一個區塊中,當然以太坊也可以通過智能合約的方式實現。另外,以太坊目前官方錢包採用 KDF 的形式,也就是我們常說的 Keystore 的形式。
  • 以太坊在EIPs/issues/85中討論,以太坊社區似乎也採用了 BIP32 的做法,提議 HD 路徑爲 : m/44'/60'/0'/0/n,n 是第 n 次生成地址。目前以太坊客戶端實現了BIP32的客戶端有:Jaxx, Metamask, Exodus, imToken, TREZOR (ETH) & Digital Bitbox

密碼、私鑰、keystore與助記詞的關係

image-20201012091537816

如何解鎖賬戶

解鎖賬戶有如下幾種方式:

  • 私鑰(Private Key)
  • Keystore+密碼(Keystore+Password)
  • 助記詞(Mnemonic code)

我們可以得到以下總結:

  • 通過私鑰+密碼可以生成keystore,即加密私鑰。
  • 通過keystore+密碼可以獲取私鑰,即解密keystore。
  • 通過助記詞根據不同的路徑獲取不同的私鑰,即使用HD錢包將助記詞轉化成種子來生成主私鑰,然後派生海量的子私鑰和地址。