溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是以太坊Keystore文件

發(fā)布時(shí)間:2021-12-24 10:20:41 來源:億速云 閱讀:136 作者:柒染 欄目:互聯(lián)網(wǎng)科技

本篇文章給大家分享的是有關(guān)什么是以太坊Keystore文件,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

進(jìn)入keystore管理以太坊私鑰的障礙很大,主要是因?yàn)橐蕴豢蛻舳嗽谥苯拥拿钚谢驁D形界面下隱藏了大部分的密碼復(fù)雜性。

例如,用geth:

$ geth account new 
Your new account is locked with a password. 
Please give a password. Do not forget this password. 
Passphrase: 
Repeat passphrase: 
Address: {008aeeda4d805471df9b2a5b0f38a0c3bcba786b} 

$ geth account list Account #0: {8a1c4d573cc29a96547816522cfe0b266e88abac} keystore:~/.ethereum/keystore/UTC---- 008aeeda4d805471df9b2a5b0f38a0c3bcba786b

我只需要輸入3個(gè)單詞就能創(chuàng)建一個(gè)新賬戶。然后輸入兩遍密碼,就這么簡單!我的以太坊keystore文件就創(chuàng)建了。 你需要把那些非常珍貴的keystore文件備份、存儲(chǔ)在一個(gè)或多個(gè)隱秘的位置,這樣就只有你能獲取這些文件并取到資金。 從經(jīng)驗(yàn)來看,當(dāng)我沒有完全理解一個(gè)新概念的微妙之處,并且過分依賴抽象層和現(xiàn)有工具來讓我的生活更輕松時(shí),我很有可能忘記一些事情,采取不必要的捷徑并且搞砸它。搞砸的時(shí)候,可能就是會(huì)以我辛苦掙來的以太幣被永久鎖定而告終(幸好它還沒有發(fā)生?。?。 幸運(yùn)的是,作為一個(gè)以太坊用戶,你能搞砸的方式并不多: 你丟失了你的keystore文件 你忘記了和文件關(guān)聯(lián)的密碼 或者以上兩者你都搞砸了。

我們將為你介紹以太坊私鑰是如何從 keystore 文件中算出來的。我們將討論加密函數(shù)(對稱加密,密鑰生成函數(shù),SHA3 哈希算法),但我們會(huì)盡可能的保證簡明直接地來解釋上述問題。

什么是keystore文件?

以太坊的 keystore 文件(Linux 系統(tǒng)存儲(chǔ)在 ~/.ethereum/keystore 或者 Windows 系統(tǒng)存儲(chǔ)在 C:\Users\Appdata/Roaming/Ethereum/keystore)是你獨(dú)有的、用于簽署交易的以太坊私鑰的加密文件。如果你丟失了這個(gè)文件,你就丟失了私鑰,意味著你失去了簽署交易的能力,意味著你的資金被永久的鎖定在了你的賬戶里。 當(dāng)然,你可以直接把你的以太坊私鑰存儲(chǔ)在一個(gè)加密文件里,但是這樣你的私鑰容易受到攻擊,攻擊者簡單的讀取你的文件、用你的私鑰簽署交易,把錢轉(zhuǎn)到他們的賬戶中。你的幣會(huì)在你意識(shí)到發(fā)生什么了之前的短時(shí)間內(nèi)丟失。 這就是以太坊 keystore 文件被創(chuàng)建的原因:它允許你以加密的方式存儲(chǔ)密鑰。這是安全性(一個(gè)攻擊者需要 keystore 文件和你的密碼才能盜取你的資金)和可用性(你只需要keystore文件和密碼就能用你的錢了)兩者之間完美的權(quán)衡。 為了讓你發(fā)送一些以太幣,大多數(shù)的以太坊客戶端會(huì)讓你輸入密碼(與創(chuàng)建賬戶時(shí)密碼相同)以解密你的以太坊私鑰。一旦解密,客戶端程序就得到私鑰簽署交易,允許你移動(dòng)資金。

Keystore文件是什么樣子的?

如果你打開一個(gè)你的賬戶文件,它看起來像這樣(取自這里):

$ cat ~/.ethereum/keystore/UTC---- 008aeeda4d805471df9b2a5b0f38a0c3bcba786b 

{ "crypto" : 
     { 
          "cipher" : "aes-128-ctr", 
          "cipherparams" : { 
              "iv" : "83dbcc02d8ccb40e466191a123791e0e" }, 
          "ciphertext" : "d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c", 
          "kdf" : "scrypt", 
          "kdfparams" : { 
               "dklen" : 32, 
               "n" : 262144, 
               "r" : 1, 
               "p" : 8, 
               "salt" : "ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19" 
          }, 
          "mac" : "2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097" 
      }, 
      "id" : "3198bc9c-6672-5ab3-d995-4942343ae5b6", 
      "version" : 3 
}

一個(gè)有許多神奇的參數(shù)的粗笨的 JSON 文件,似乎與復(fù)雜的加密操作相關(guān)。這絕不吸引人。 讓我們深入理解一下 如果你看這個(gè) keystore 文件的結(jié)構(gòu),你會(huì)看到大部分內(nèi)容都是在“crypto”中的:

"crypto" : { 
     "cipher" : "aes-128-ctr", 
     "cipherparams" : { 
         "iv" : "83dbcc02d8ccb40e466191a123791e0e" 
     }, 
     "ciphertext" : "d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c", 
     "kdf" : "scrypt", 
     "kdfparams" : { 
          "dklen" : 32, 
          "n" : 262144, 
          "r" : 1, 
          "p" : 8, 
          "salt" : "ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19" 
     }, 
     "mac" : "2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097" 
},

這包括:

  • cipher:對稱 AES 算法的名稱;

  • cipherparams:上述 cipher 算法需要的參數(shù);

  • ciphertext:你的以太坊私鑰使用上述 cipher 算法進(jìn)行加密;

  • kdf:密鑰生成函數(shù),用于讓你用密碼加密 keystore 文件;

  • kdfparams:上述 kdf 算法需要的參數(shù);

  • Mac:用于驗(yàn)證密碼的代碼。

讓我們看看他們是如何協(xié)同工作的,如何在你的密碼下保護(hù) keystore 文件。

 加密你的私鑰

就像之前提到的,一個(gè)以太坊賬戶就是用于加密簽署交易的一個(gè)私鑰?—公鑰對。為了確保你的私鑰沒有在文件中明文存儲(chǔ)(即任何人只要能得到這個(gè)文件就能讀),使用強(qiáng)對稱算法(cipher)對其加密至關(guān)重要。 這些對稱算法使用密鑰來加密數(shù)據(jù)。加密后的數(shù)據(jù)可以使用相同的方法和同樣的密鑰來解密,因此算法命名為對稱算法。在本文中,我們稱這個(gè)對稱密鑰為解密密鑰,因?yàn)樗鼘⒂糜趯ξ覀兊囊蕴凰借€進(jìn)行解密。

以下是 cipher,cipherparams 和 ciphertext 對應(yīng)的概念:

  • Cipher 是用于加密以太坊私鑰的對稱加密算法。此處cipher用的是 aes-128-ctr 加密模式

  • Cipherparams 是 aes-128-ctr 加密算法需要的參數(shù)。

         在這里,用到的唯一的參數(shù) iv,是aes-128-ctr加密算法需要的初始化向量。

  • Ciphertext 密文是 aes-128-ctr 函數(shù)的加密輸入。

所以,在這里,你已經(jīng)有了進(jìn)行解密以太坊私鑰計(jì)算所需要的一切…等等。你需要首先取回你的解密密鑰。

什么是以太坊Keystore文件

1 -ciphertex 密文的對稱解密-

2. 用你的密碼來保護(hù)它

要確保解鎖你的賬戶很容易,你不需要記住你的每一個(gè)又長又非用戶友好型的用于解密 ciphertext 密文解密密鑰。相反,以太坊開發(fā)者選擇了基于密碼的保護(hù),也就是說你只需要輸入密碼就能拿回解密密鑰。

為了能做到這一點(diǎn),以太坊用了一個(gè)密鑰生成函數(shù),輸入密碼和一系列參數(shù)就能計(jì)算解密密鑰。 這就是 kdf 和 kdfparams 的用途:

  • kdf 是一個(gè)密鑰生成函數(shù),根據(jù)你的密碼計(jì)算(或者取回)解密密鑰。在這里,kdf 用的是scrypt算法。

  • kdfparams 是scrypt函數(shù)需要的參數(shù)。在這里,簡單來說,dklen、n、r、p 和 salt 是 kdf 函數(shù)的參數(shù)。

更多關(guān)于 scrypt 函數(shù)的信息可以在這里找到。 在這里,用 kdfparams 參數(shù)對 scrypt 函數(shù)進(jìn)行調(diào)整,反饋到我們的密碼中,你就會(huì)得到解密密鑰也就是密鑰生成函數(shù)的輸出。

什么是以太坊Keystore文件

2 -用密碼生成密鑰-

3. 確保你的密碼是對的

我們描述了用密碼和 keystore 文件生成以太坊私鑰所需要的所有東西。然而,如果解鎖賬戶的密碼錯(cuò)誤會(huì)發(fā)生什么?

根據(jù)迄今為止我們所看到的,所有操作(密碼派生和解密)都會(huì)成功,但是最終計(jì)算的以太坊私鑰不是正確的,這首先違背了密鑰文件的使用初衷!

我們要保證輸入解鎖賬戶的密碼是正確的,和最初創(chuàng)建 keystore 文件時(shí)一樣(回想一下 geth 下創(chuàng)建新賬戶時(shí)兩次輸入的密碼)。 這就是 keystore 文件中 mac 值起作用的地方。在密鑰生成函數(shù)執(zhí)行之后,它的輸出(解密密鑰)和 ciphertext 密文就被處理【注1】,并且和 mac(就像一種認(rèn)可的印章)作比較。如果結(jié)果和 mac 相同,那么密碼就是正確的,并且解密就可以開始了。

【注1】這里有點(diǎn)簡略了。在和 mac 進(jìn)行比較之前,解密密鑰(左起第二字節(jié)開始的16字節(jié))要和 ciphertext 密文連接在一起,并進(jìn)行哈希散列(用SHA3-256的方法)。 更多信息請?jiān)L問這里。

什么是以太坊Keystore文件

把所有的都放到一起考慮 唷!

如果你已經(jīng)做到了這一點(diǎn),那么恭喜你! 讓我們回顧一下我們描述的3個(gè)函數(shù)。

  • 首先,你輸入了密碼,這個(gè)密碼作為 kdf 密鑰生成函數(shù)的輸入,來計(jì)算解密密鑰。

  • 然后,剛剛計(jì)算出的解密密鑰和 ciphertext 密文連接并進(jìn)行處理,和 mac 比較來確保密碼是正確的。

  • 最后,通過 cipher 對稱函數(shù)用解密密鑰對 ciphertext 密文解密。 瞧!解密的結(jié)果是你的以太坊私鑰。

你可以在這里看看整個(gè)過程:

什么是以太坊Keystore文件

 就像你從圖中可以看到的,整個(gè)過程可以看做一個(gè)黑盒(不過,圖中是個(gè)灰盒),你的密碼是惟一的輸入,你的以太坊私鑰是惟一的輸出。所需的其他信息都可以在你的以太坊賬戶創(chuàng)建時(shí)生成的keystore文件中獲得。 由于這個(gè)原因,請確保你的密碼足夠強(qiáng)(并且無論如何你要記住它?。┎拍鼙WC即使攻擊者偷到了你的keystore文件也不能輕易得到你的私鑰。

測試數(shù)據(jù)

Details:

  • Address: 008aeeda4d805471df9b2a5b0f38a0c3bcba786b

  • ICAP: XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67

  • UUID: 3198bc9c-6672-5ab3-d9954942343ae5b6

  • Password: testpassword

  • Secret: 7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d

PBKDF2-SHA-256

Test vector using AES-128-CTR and PBKDF2-SHA-256:

File contents of ~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.json:

{
    "crypto" : {
        "cipher" : "aes-128-ctr",
        "cipherparams" : {
            "iv" : "6087dab2f9fdbbfaddc31a909735c1e6"
        },
        "ciphertext" : "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46",
        "kdf" : "pbkdf2",
        "kdfparams" : {
            "c" : 262144,
            "dklen" : 32,
            "prf" : "hmac-sha256",
            "salt" : "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd"
        },
        "mac" : "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2"
    },
    "id" : "3198bc9c-6672-5ab3-d995-4942343ae5b6",
    "version" : 3
}

Intermediates:

  • Derived key: f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551

  • MAC Body: e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46

  • MAC 517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2

  • Cipher key: f06d69cdc7da0faffb1008270bca38f5

Scrypt

Test vector using AES-128-CTR and Scrypt:

{
    "crypto" : {
        "cipher" : "aes-128-ctr",
        "cipherparams" : {
            "iv" : "83dbcc02d8ccb40e466191a123791e0e"
        },
        "ciphertext" : "d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c",
        "kdf" : "scrypt",
        "kdfparams" : {
            "dklen" : 32,
            "n" : 262144,
            "r" : 1,
            "p" : 8,
            "salt" : "ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19"
        },
        "mac" : "2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097"
    },
    "id" : "3198bc9c-6672-5ab3-d995-4942343ae5b6",
    "version" : 3
}

Intermediates:

  • Derived key: fac192ceb5fd772906bea3e118a69e8bbb5cc24229e20d8766fd298291bba6bd

  • MAC Body bb5cc24229e20d8766fd298291bba6bdd172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c

  • MAC: 2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097

  • Cipher key: fac192ceb5fd772906bea3e118a69e8b

從keystore提取Private Key的源代碼

package main

import (
	"encoding/hex"
	"flag"
	"fmt"
	"io/ioutil"
	"os"

	"github.com/ethereum/go-ethereum/accounts/keystore"
	"github.com/ethereum/go-ethereum/crypto"
)

func main() {
	ksfilefullpath := ""
	kstype := ""
	kspassword := ""

	flags := flag.NewFlagSet(os.Args[0], flag.ExitOnError)

	flags.StringVar(&ksfilefullpath, "keystore-src", "", "`path` to keystore to be processed")
	flags.StringVar(&kstype, "keystore-type", "", "keystore type: `pem`,`keystore`")
	flags.StringVar(&kspassword, "keystore-password", "", "keystore password")

	if err := flags.Parse(os.Args[1:]); err != nil {
		fmt.Fprintln(os.Stderr, "Failed to parse flags:", err)
		os.Exit(1)
	}

	keyjson, err := ioutil.ReadFile(ksfilefullpath)
	if err != nil {
		fmt.Println(err)
	}

	// Decrypt with the correct password
	key, err := keystore.DecryptKey(keyjson, kspassword)
	if err != nil {
		fmt.Println("test : json key failed to decrypt: %v", err)
	}

	fmt.Println("Private Key= " + hex.EncodeToString(crypto.FromECDSA(key.PrivateKey)))
}

編譯

什么是以太坊Keystore文件

運(yùn)行

E:\dev\Coins\keymanager>keymanager.exe --keystore-src=E:\Gowork\src\discountedBackend\keystore\UTC--2019-12-05T04-57-19.853322540Z--a4e71aeeadaa01fd0f15455f67d7d2cad32ebfca --keystore-type=keystore --keystore-password=geth223
Private key= fe0e4d19f7690086acf252dcbdb04ef878c82969c8dcd4c7f2221c723e2d65f1
 

什么是以太坊Keystore文件

提取的Private Key:  ab979c2c4d092212af817802f31313bd6f4144b4b9cb289f659c29f5cabbd428

去https://www.myetherwallet.com/#view-wallet-info,上傳keystore

什么是以太坊Keystore文件

看看結(jié)果

什么是以太坊Keystore文件

什么是以太坊Keystore文件

Hola, 一模一樣

什么是以太坊Keystore文件

算法參考

原文鏈接

以上就是什么是以太坊Keystore文件,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI