国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

以太坊錢包開發系列2 - 賬號Keystore文件導入導出

SegmentFault / 1419人閱讀

摘要:文件如何生成的以太坊是使用對稱加密算法來加密私鑰生成文件,因此對稱加密秘鑰注意它其實也是發起交易時需要的解密秘鑰的選擇就非常關鍵,這個秘鑰是使用算法推導派生而出。加密推倒的相關配置是用于加密以太坊私鑰的對稱加密算法。

本文首發于深入淺出區塊鏈社區
原文鏈接:[使用 ethers.js 開發以太坊 Web 錢包 2 - 賬號 Keystore 文件導入導出)
](https://learnblockchain.cn/20...,請讀者前往原文閱讀

以太坊去中心化網頁錢包開發系列,將從零開始開發出一個可以實際使用的錢包,本系列文章是理論與實戰相結合,一共有四篇:創建錢包賬號、賬號Keystore文件導入導出、展示錢包信息及發起簽名交易、發送Token(代幣),這是第二篇,主要介紹錢包賬號導出與導入,將對Keystore文件的生成的原理進行介紹。

如何導入Geth創建的賬號?

在上一篇文章,介紹了如何使用私鑰及助記詞來創建賬號,如果是使用已有的私鑰及助記詞,這其實也是賬號導入的過程。

有一些同學會問,我的賬號是Geth生成的,如何導入到錢包呢?使用Geth的同學,應該知道Geth在創建賬號時會生成一個對應keystore JSON文件,Keystore文件存儲加密后的私鑰信息,因此我們需要做的就是導入這個Keystore文件,這個文件通常在同步區塊數據的目錄下的keystore文件夾(如: ~/.ethereum/keystore)里。

盡管在ethers.js 中,簡單的使用一個函數就可以完成keystore文件的導入,不過理解Keystore 文件的作用及原理還是非常有必要的,當然如果你是在沒有興趣,可以直接跳到本文最后一節:使用ethers.js 實現賬號導出導入。

詳細解讀 Keystore 文件 為什么需要 Keystore 文件

通過這篇文章理解開發HD 錢包涉及的 BIP32、BIP44、BIP39,私鑰其實就代表了一個賬號,最簡單的保管賬號的方式就是直接把私鑰保存起來,如果私鑰文件被人盜取,我們的數字資產將洗劫一空。

Keystore 文件就是一種以加密的方式存儲密鑰的文件,這樣的發起交易的時候,先從Keystore 文件是使用密碼解密出私鑰,然后進行簽名交易。這樣做之后就會安全的多,因為只有黑客同時盜取 keystore 文件和密碼才能盜取我們的數字資產。

Keystore 文件如何生成的

以太坊是使用對稱加密算法來加密私鑰生成Keystore文件,因此對稱加密秘鑰(注意它其實也是發起交易時需要的解密秘鑰)的選擇就非常關鍵,這個秘鑰是使用KDF算法推導派生而出。因此在完整介紹Keystore 文件如何生成前,有必要先介紹一下KDF。

使用 KDF 生成秘鑰

密碼學KDF(key derivation functions),其作用是通過一個密碼派生出一個或多個秘鑰,即從 password 生成加密用的 key。

其實在理解開發HD 錢包涉及的 BIP32、BIP44、BIP39中介紹助記詞推導出種子的PBKDF2算法就是一種KDF函數,其原理是加鹽以及增加哈希迭代次數。

而在Keystore中,是用的是Scrypt算法,用一個公式來表示的話,派生的Key生成方程為:

</>復制代碼

  1. DK = Scrypt(salt, dk_len, n, r, p)

其中的 salt 是一段隨機的鹽,dk_len 是輸出的哈希值的長度。n 是 CPU/Memory 開銷值,越高的開銷值,計算就越困難。r 表示塊大小,p 表示并行度。

</>復制代碼

  1. Litecoin 就使用 scrypt 作為它的 POW 算法

實際使用中,還會加上一個密碼進行計算,用一張圖來表示這個過程就是:

對私鑰進行對稱加密

上面已經用KDF算法生成了一個秘鑰,這個秘鑰就是接著進行對稱加密的秘鑰,這里使用的對稱加密算法是 aes-128-ctr,aes-128-ctr 加密算法還需要用到一個參數初始化向量 iv。

Keystore文件

好了,我們現在結合具體 Keystore文件的內容,就很容易理解了Keystore 文件怎么產生的了。

</>復制代碼

  1. {
  2. "address":"856e604698f79cef417aab...",
  3. "crypto":{
  4. "cipher":"aes-128-ctr",
  5. "ciphertext":"13a3ad2135bef1ff228e399dfc8d7757eb4bb1a81d1b31....",
  6. "cipherparams":{
  7. "iv":"92e7468e8625653f85322fb3c..."
  8. },
  9. "kdf":"scrypt",
  10. "kdfparams":{
  11. "dklen":32,
  12. "n":262144,
  13. "p":1,
  14. "r":8,
  15. "salt":"3ca198ce53513ce01bd651aee54b16b6a...."
  16. },
  17. "mac":"10423d837830594c18a91097d09b7f2316..."
  18. },
  19. "id":"5346bac5-0a6f-4ac6-baba-e2f3ad464f3f",
  20. "version":3
  21. }

來解讀一下各個字段:

address: 賬號地址

version: Keystore文件的版本,目前為第3版,也稱為V3 KeyStore。

id : uuid

crypto: 加密推倒的相關配置.

cipher 是用于加密以太坊私鑰的對稱加密算法。用的是 aes-128-ctr 。

cipherparams 是 aes-128-ctr 加密算法需要的參數。在這里,用到的唯一的參數 iv。

ciphertext 是加密算法輸出的密文,也是將來解密時的需要的輸入。

kdf: 指定使用哪一個算法,這里使用的是 scrypt。

kdfparams: scrypt函數需要的參數

mac: 用來校驗密碼的正確性, mac= sha3(DK[16:32], ciphertext) 下面一個小節多帶帶分析。

我們來完整梳理一下 Keystore 文件的產生:

使用scrypt函數 (根據密碼 和 相應的參數) 生成秘鑰

使用上一步生成的秘鑰 + 賬號私鑰 + 參數 進行對稱加密。

把相關的參數 和 輸出的密文 保存為以上格式的 JSON 文件

如何確保密碼是對的?

當我們在使用Keystore文件來還原私鑰時,依然是使用kdf生成一個秘鑰,然后用秘鑰對ciphertext進行解密,其過程如下:

此時細心的同學會發現,無論使用說明密碼,來進行這個操作,都會生成一個私鑰,但是最終計算的以太坊私鑰到底是不是正確的,卻不得而知。

這就是 keystore 文件中 mac 值的作用。mac 值是 kdf輸出 和 ciphertext 密文進行SHA3-256運算的結果,顯然密碼不同,計算的mac 值也不同,因此可以用來檢驗密碼的正確性。檢驗過程用圖表示如下:

現在我們以解密的角度完整的梳理下流程,就可以得到以下圖:

用ethers.js 實現賬號導出導入

ethers.js 直接提供了加載keystore JSON來創建錢包對象以及加密生成keystore文件的方法,方法如下:

</>復制代碼

  1. // 導入keystore Json
  2. ethers.Wallet.fromEncryptedJson(json, password, [progressCallback]).then(function(wallet) {
  3. // wallet
  4. });
  5. // 使用錢包對象 導出keystore Json
  6. wallet.encrypt(pwd, [progressCallback].then(function(json) {
  7. // 保存json
  8. });

現在結合界面來完整的實現賬號導出及導入,先看看導出,UI圖如下:

HTML 代碼如下:

</>復制代碼

  1. KeyStore 導出:

  2. 密碼:
  3. 導出

上面主要定義了一個密碼輸入框和一個導出按鈕,點擊“導出”后,處理邏輯代碼如下:

</>復制代碼

  1. // "導出" 按鈕,執行exportKeystore函數
  2. $("#save-keystore").click(exportKeystore);
  3. exportKeystore: function() {
  4. // 獲取密碼
  5. var pwd = $("#save-keystore-file-pwd");
  6. // wallet 是上一篇文章中生成的錢包對象
  7. wallet.encrypt(pwd.val()).then(function(json) {
  8. var blob = new Blob([json], {type: "text/plain;charset=utf-8"});
  9. // 使用了FileSaver.js 進行文件保存
  10. saveAs(blob, "keystore.json");
  11. });
  12. }

FileSaver.js 是可以用來在頁面保存文件的一個庫。

再來看看導入keystore 文件, UI圖如下:

</>復制代碼

  1. 加載賬號Keystore文件

  2. Keystore:
    把Json文件拖動到這里
    密碼:
  3. 解密

上面主要定義了一個文件輸入框、一個密碼輸入框及一個“解密“按鈕,因此處理邏輯包含兩部分,一是讀取文件,二是解析加載賬號,關鍵代碼如下:

</>復制代碼

  1. // 使用FileReader讀取文件,
  2. var fileReader = new FileReader();
  3. fileReader.onload = function(e) {
  4. var json = e.target.result;
  5. // 從加載
  6. ethers.Wallet.fromEncryptedJson(json, password).then(function(wallet) {
  7. }, functionerror) {
  8. });
  9. };
  10. fileReader.readAsText(inputFile.files[0]);

哈哈哈,有到了推廣時間了,完整源碼請訂閱深入淺出區塊鏈技術小專欄查看,趕緊訂閱吧,走過路過,不容錯過。
戳鏈接收看詳細的視頻課程講解。

參考文檔

what-is-an-ethereum-keystore-file

深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。

深入淺出區塊鏈知識星球最專業技術問答社區,加入社區還可以在微信群里和300多位區塊鏈技術愛好者一起交流。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/24363.html

相關文章

  • 如何開發一款以太(安卓)錢包系列2 - 導入賬號賬號管理

    摘要:本文首發于深入淺出區塊鏈社區原文鏈接以太坊安卓錢包系列導入賬號及賬號管理原文已更新,請讀者前往原文閱讀這是如何開發一款以太坊安卓錢包系列第篇,如何導入賬號。提示大家閱讀本文時,最好把代碼庫克隆到本地對照閱讀。 本文首發于深入淺出區塊鏈社區原文鏈接:以太坊(安卓)錢包系列2 - 導入賬號及賬號管理原文已更新,請讀者前往原文閱讀 這是如何開發一款以太坊(安卓)錢包系列第2篇,如何導入賬號。...

    Tecode 評論0 收藏0
  • 如何開發一款以太(安卓)錢包系列1 - 通過助記詞創建賬號

    摘要:本文首發于深入淺出區塊鏈社區原文鏈接以太坊安卓錢包系列通過助記詞創建賬號原文已更新,請讀者前往原文閱讀上周我開源了一款錢包,反映很好,一周時間不到已經快到。的功能和類似,它是比特幣協議的實現,他實現了及相關協議。 本文首發于深入淺出區塊鏈社區原文鏈接:以太坊(安卓)錢包系列1 - 通過助記詞創建賬號原文已更新,請讀者前往原文閱讀 上周我開源了一款錢包,反映很好,一周時間不到已經快到10...

    bbbbbb 評論0 收藏0
  • 如何開發一款以太(安卓)錢包系列1 - 通過助記詞創建賬號

    摘要:本文首發于深入淺出區塊鏈社區原文鏈接以太坊安卓錢包系列通過助記詞創建賬號原文已更新,請讀者前往原文閱讀上周我開源了一款錢包,反映很好,一周時間不到已經快到。的功能和類似,它是比特幣協議的實現,他實現了及相關協議。 本文首發于深入淺出區塊鏈社區原文鏈接:以太坊(安卓)錢包系列1 - 通過助記詞創建賬號原文已更新,請讀者前往原文閱讀 上周我開源了一款錢包,反映很好,一周時間不到已經快到10...

    genefy 評論0 收藏0
  • 以太錢包開發系列1 - 創建錢包賬號

    摘要:錢包功能一個錢包通常主要包含的功能有賬號管理主要是私鑰的管理創建賬號賬號導入導出賬號信息展示如以太幣余額代幣余額。 本文首發于深入淺出區塊鏈社區原文鏈接:[使用 ethers.js 開發以太坊 Web 錢包 1 - 創建錢包賬號)](https://learnblockchain.cn/20...,請讀者前往原文閱讀 以太坊去中心化網頁錢包開發系列,將從零開始開發出一個可以實際使用的錢...

    1fe1se 評論0 收藏0
  • 以太開發去中心化應用系列——以太錢包(一)

    摘要:以太坊的錢包在以太坊中,所有轉賬等交易操作都需要用賬戶來完成,一個合法的交易需要有發起賬戶和接收賬戶。比如常見的以太坊錢包有等。 一、錢包的說明 1. 現實中的錢包 大部分人錢包里都會有幾張銀行卡,每一張銀行卡都對應著一個賬戶,我們可以用這些賬戶進行支付、轉賬等操作。那么錢包的作用就是存放和管理這些銀行卡(賬戶)。 2. 以太坊的錢包 在以太坊中,所有轉賬等交易操作都需要用賬戶來完成,...

    Pocher 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<