Alice的公私鑰, 簽名和驗(yàn)證簽名僅僅確定了Alice對(duì)數(shù)字資產(chǎn)A所有權(quán)的宣言. 之后, Bob也可以用自己的私鑰對(duì)資產(chǎn)A進(jìn)行簽名宣誓所有權(quán)。區(qū)塊鏈中叫雙花,即重復(fù)宣稱所有權(quán), 也稱重復(fù)花費(fèi)交易。這時(shí)候需要共識(shí)算法(集體成員pow或委員會(huì)代表pos監(jiān)督數(shù)據(jù)的變化,達(dá)成一致意見即共識(shí))去確保數(shù)據(jù)的唯一性和不可逆。
大話密碼技術(shù)(五)數(shù)字簽名與數(shù)字證書原理 - 知乎
證書是為了解決公鑰派送過程中被攔截的問題. 即保證公鑰在傳遞過程中沒有被替換.
數(shù)字簽名流程中接收者需要用公鑰驗(yàn)簽發(fā)送者的簽名,若中間人用自己的公鑰替換了發(fā)送者的公鑰,則他就可以用自己的私鑰簽名信息,而接受者使用被攻擊者替換的公鑰驗(yàn)簽數(shù)據(jù)就可以被通過。為了解決公鑰派送問題,可以通過數(shù)字證書來對(duì)發(fā)送者的公鑰做認(rèn)證。
找一個(gè)第三方公認(rèn)機(jī)構(gòu)對(duì)公鑰進(jìn)行簽名.
1 數(shù)字簽名
數(shù)字簽名是使用hash算法與公鑰加密技術(shù)實(shí)現(xiàn),用于鑒別數(shù)字信息真實(shí)性和不可抵賴性的方法。它有以下幾個(gè)特征:
(1)報(bào)文鑒別:接收者能校驗(yàn)發(fā)送者對(duì)報(bào)文的簽名
(2)報(bào)文完整性:接收者不能偽造報(bào)文簽名或更改報(bào)文內(nèi)容
(3)不可抵賴:發(fā)送者事后不能抵賴對(duì)報(bào)文的簽名
數(shù)字簽名流程如下:
接下來分析該流程是否符合以上三個(gè)特征
(1)報(bào)文鑒別:數(shù)字簽名中的私鑰具有唯一性,除簽名者之外都不能偽造簽名,并防止被假冒
(2)報(bào)文完整性:由于數(shù)字簽名中包含hash算法,對(duì)簽名文檔的任何未經(jīng)授權(quán)的修改將立即被顯見
(3)不可抵賴性:由于報(bào)文經(jīng)過了發(fā)送者的私鑰簽名,他人無法獲取其私鑰,故無法偽造其簽名,因此發(fā)送者也無法抵賴
2 數(shù)字證書
數(shù)字簽名流程中接收者需要用公鑰驗(yàn)簽發(fā)送者的簽名,若中間人用自己的公鑰替換了發(fā)送者的公鑰,則他就可以用自己的私鑰簽名信息,而接受者使用被攻擊者替換的公鑰驗(yàn)簽數(shù)據(jù)就可以被通過。為了解決公鑰派送問題,可以通過數(shù)字證書來對(duì)發(fā)送者的公鑰做認(rèn)證。
2.1 數(shù)字證書的構(gòu)成
數(shù)字證書格式遵循ITUTX.509標(biāo)準(zhǔn),X509證書包含以下內(nèi)容:
(1)證書版本
(2)證書序列號(hào)
(3)證書所使用的簽名算法
(4)證書的發(fā)行機(jī)構(gòu)名稱,一般采用X500格式
(5)證書的有效期,通常采用UTC時(shí)間
(6)證書所有人名稱,一般采用X500格式
(7)證書所有人的公鑰
(8)證書發(fā)行者對(duì)證書的簽名
2.2 數(shù)字證書的頒發(fā)
數(shù)字證書是由數(shù)字證書認(rèn)證中心(CA)頒發(fā),用于認(rèn)證證書持有者身份的,其核心是使用認(rèn)證中心的私鑰對(duì)證書申請(qǐng)人身份(主要是公鑰)進(jìn)行簽名認(rèn)證。認(rèn)證中心可以形成以下的層級(jí)結(jié)構(gòu),即根證書認(rèn)證機(jī)構(gòu)可為二級(jí)認(rèn)證機(jī)構(gòu)頒發(fā)證書,二級(jí)認(rèn)證機(jī)構(gòu)可為三級(jí)認(rèn)證機(jī)構(gòu)頒發(fā)證書,同時(shí)他們都可以為用戶頒發(fā)證書。
本質(zhì)上,數(shù)字證書是數(shù)字證書認(rèn)證中心對(duì)證書申請(qǐng)者的信息和公鑰做簽名,以自身的權(quán)威性為其身份做背書?! ?br> 以上數(shù)字證書的層級(jí)結(jié)構(gòu)叫做數(shù)字證書鏈,其中頂層的證書被稱為根證書,它是由根證書中心自簽名的。在驗(yàn)證數(shù)字證書時(shí)可按照該證書鏈逐級(jí)驗(yàn)證證書的合法性。根證書的合法性是由其自身保證的,因此一般會(huì)被預(yù)先安裝到操作系統(tǒng)或?yàn)g覽器等軟件中。
2.3 數(shù)字證書CRL和OCSP
數(shù)字證書在頒發(fā)時(shí)即設(shè)置了有效時(shí)間,但若需要在有效時(shí)間內(nèi)撤銷證書,則可向證書頒發(fā)機(jī)構(gòu)申請(qǐng)撤銷證書,證書被撤銷后將被保存到證書撤銷列表(CAL)中。
證書驗(yàn)證時(shí)需要驗(yàn)證其是否位于證書撤銷列表中,OCSP(在線證書狀態(tài)協(xié)議)就是用于在線查詢證書狀態(tài)的。
根據(jù)X509標(biāo)準(zhǔn),CRL的內(nèi)容如下:
(1)版本
(2)簽名算法
(3)簽發(fā)者
(4)更新時(shí)間
(5)下一次更新時(shí)間
(6)廢止的證書列表
(7)用戶證書序列號(hào)
(8)廢止時(shí)間
(9)CRL入口擴(kuò)展
2.4 數(shù)字證書相關(guān)文件格式
在數(shù)字證書申請(qǐng)和使用流程中,有幾種常見的文件格式:
(1)der格式證書:.cer,.crt
(2)pem格式證書:.pem
(3)pkcs12格式:.pfx,.p12
(4)pkcs10證書申請(qǐng)格式:.p10
(5)pkcs7證書申請(qǐng)應(yīng)答格式:.p7r
(6)pkcs7二進(jìn)制格式:.p7b
2.5 創(chuàng)建自己的CA
所有公司都可以頒發(fā)數(shù)字證書,公司頒發(fā)的證書不一定能在國際上得到廣泛認(rèn)可。但若在自己生產(chǎn)的終端中安裝自己建立的CA根證書,則可以建立自身的CA信任鏈。
3.?密鑰交換
非對(duì)稱加解密公鑰可以公開交換,但其加解密速度比對(duì)稱加解密慢得多(大概為幾百分之一)。而對(duì)稱加解密雙方的密鑰若通過明文傳輸,則很容易受到中間人攻擊,因此需要采用特定的方法實(shí)現(xiàn)雙方密鑰的交換。
3.1 PSK密鑰交換
PSK方案通信雙方使用預(yù)先共享的密鑰進(jìn)行通信,以下為汽車網(wǎng)絡(luò)安全項(xiàng)目EVITA中一個(gè)PSK方案的例子。
上圖每個(gè)ecu都將其密鑰預(yù)置到keymaster中,在需要通信時(shí),keymaster產(chǎn)生一個(gè)session key,并分別用ecu1的密鑰k1加密后發(fā)給ecu1,用ecu2的密鑰k2加密后發(fā)給ecu2。ecu1和ecu2接收到信息后用各自的密鑰解密后得到session key,此后雙方可使用該session key實(shí)現(xiàn)加密通信。
3.2 非對(duì)稱方式密鑰交換
該方法通信雙方需要先交換公鑰,在通信前用非對(duì)稱算法進(jìn)行session密鑰協(xié)商。即通信一方使用隨機(jī)數(shù)創(chuàng)建一個(gè)密鑰,然后用自己的私鑰加密后發(fā)送給對(duì)方,接收方用發(fā)送方的公鑰解密出密鑰后。雙方可使用該session key執(zhí)行加密通信。
TLS通信方式的基礎(chǔ)即是上述方式,只是其中增加了通過數(shù)字證書進(jìn)行身份認(rèn)證,以及使用更復(fù)雜的密鑰協(xié)商策略等。
3.3 DH算法密鑰交換
DH算法是一種密鑰交換算法,它可以在雙方不直接傳遞密鑰的情況下完成密鑰交換。其流程如下圖所示:
1 Alice選擇一個(gè)素?cái)?shù)p,底數(shù)g和隨機(jī)數(shù)a,并執(zhí)行如下計(jì)算
A = g^a mod p
2 Alice把p,g和A發(fā)送給Bob
3 Bob接收到數(shù)據(jù)后,選擇一個(gè)隨機(jī)數(shù)b,并執(zhí)行以下計(jì)算
B = g ^b mod p
s = A^b mod p
4 Bob將B發(fā)送給Alice
5 Alice執(zhí)行如下計(jì)算
B^a mod p
= (g^b mod p)^a mod p
= g^ab mod p
= (g^a mod p)^b mod p
= A^b mod p
= s
6 因此Alice和Bob都計(jì)算得到了共享密鑰s,此后可以用該密鑰進(jìn)行加密通信
理解開發(fā)HD 錢包涉及的 BIP32、BIP44、BIP39 | 登鏈社區(qū) | 區(qū)塊鏈技術(shù)社區(qū)
理解開發(fā)HD 錢包涉及的 BIP32、BIP44、BIP39
如果你還在被HD錢包(分層確定性錢包)、BIP32、BIP44、BIP39搞的一頭霧水,來看看這邊文章吧。
如果你還在被HD錢包(分層確定性錢包)、BIP32、BIP44、BIP39搞的一頭霧水,來看看這邊文章吧。
數(shù)字錢包概念
錢包用來存錢的,在區(qū)塊鏈中,我們的數(shù)字資產(chǎn)都會(huì)對(duì)應(yīng)到一個(gè)賬戶地址上, 只有擁有賬戶的鑰匙(私鑰)才可以對(duì)資產(chǎn)進(jìn)行消費(fèi)(用私鑰對(duì)消費(fèi)交易簽名)。
私鑰和地址的關(guān)系如下:
(圖來自精通比特幣)
一句話概括下就是:私鑰通過橢圓曲線生成公鑰, 公鑰通過哈希函數(shù)生成地址,這兩個(gè)過程都是單向的。
因此實(shí)際上,數(shù)字錢包實(shí)際是一個(gè)管理私鑰(生成、存儲(chǔ)、簽名)的工具,注意錢包并不保存資產(chǎn),資產(chǎn)是在鏈上的。
如何創(chuàng)建賬號(hào)
創(chuàng)建賬號(hào)關(guān)鍵是生成一個(gè)私鑰, 私鑰是一個(gè)32個(gè)字節(jié)的數(shù),?生成一個(gè)私鑰在本質(zhì)上在1到2^256之間選一個(gè)數(shù)字。
因此生成密鑰的第一步也是最重要的一步,是要找到足夠安全的熵源,即隨機(jī)性來源,只要選取的結(jié)果是不可預(yù)測(cè)或不可重復(fù)的,那么選取數(shù)字的具體方法并不重要。
比如可以擲硬幣256次,用紙和筆記錄正反面并轉(zhuǎn)換為0和1,隨機(jī)得到的256位二進(jìn)制數(shù)字可作為錢包的私鑰。
從編程的角度來看,一般是通過在一個(gè)密碼學(xué)安全的隨機(jī)源(不建議大家自己去寫一個(gè)隨機(jī)數(shù))中取出一長串隨機(jī)字節(jié),對(duì)其使用SHA256哈希算法進(jìn)行運(yùn)算,這樣就可以方便地產(chǎn)生一個(gè)256位的數(shù)字。
實(shí)際過程需要比較下是否小于n-1(n = 1.158 * 10^77, 略小于2^256),我們就有了一個(gè)合適的私鑰。否則,我們就用另一個(gè)隨機(jī)數(shù)再重復(fù)一次。這樣得到的私鑰就可以根據(jù)上面的方法進(jìn)一步生成公鑰及地址。
BIP32
錢包也是一個(gè)私鑰的容器,按照上面的方法,我們可以生成一堆私鑰(一個(gè)人也有很多賬號(hào)的需求,可以更好保護(hù)隱私),而每個(gè)私鑰都需要備份就特別麻煩的。
最早期的比特幣錢包就是就是這樣,還有一個(gè)昵稱:“Just a Bunch Of Keys(一堆私鑰)“
為了解決這種麻煩,就有了BIP32 提議: 根據(jù)一個(gè)隨機(jī)數(shù)種子通過分層確定性推導(dǎo)的方式得到n個(gè)私鑰,這樣保存的時(shí)候,只需要保存一個(gè)種子就可以,私鑰可以推導(dǎo)出來,如圖:
(圖來自精通比特幣)上圖中的孫秘鑰就可以用來簽發(fā)交易。
補(bǔ)充說明下 BIP: Bitcoin Improvement Proposals 比特幣改進(jìn)建議, bip32是第32個(gè)改進(jìn)建議。
BIP32提案的名字是:Hierarchical Deterministic Wallets, 就是我們所說的HD錢包。
來分析下這個(gè)分層推導(dǎo)的過程,第一步推導(dǎo)主秘鑰的過程:
根種子輸入到HMAC-SHA512算法中就可以得到一個(gè)可用來創(chuàng)造主私鑰(m) 和 一個(gè)主鏈編碼( a master chain code)這一步生成的秘鑰(由私鑰或公鑰)及主鏈編碼再加上一個(gè)索引號(hào),將作為HMAC-SHA512算法的輸入繼續(xù)衍生出下一層的私鑰及鏈編碼,如下圖:
衍生推導(dǎo)的方案其實(shí)有兩個(gè):一個(gè)用父私鑰推導(dǎo)(稱為強(qiáng)化衍生方程),一個(gè)用父公鑰推導(dǎo)。同時(shí)為了區(qū)分這兩種不同的衍生,在索引號(hào)也進(jìn)行了區(qū)分,索引號(hào)小于2^31用于常規(guī)衍生,而2^31到2^32-1之間用于強(qiáng)化衍生,為了方便表示索引號(hào)i',表示2^31+i。
因此增加索引(水平擴(kuò)展)及 通過子秘鑰向下一層(深度擴(kuò)展)可以無限生成私鑰。
注意, 這個(gè)推導(dǎo)過程是確定(相同的輸入,總是有相同的輸出)也是單向的,子密鑰不能推導(dǎo)出同層級(jí)的兄弟密鑰,也不能推出父密鑰。如果沒有子鏈碼也不能推導(dǎo)出孫密鑰?,F(xiàn)在我們已經(jīng)對(duì)分層推導(dǎo)有了認(rèn)識(shí)。
一句話概括下BIP32就是:為了避免管理一堆私鑰的麻煩提出的分層推導(dǎo)方案。
秘鑰路徑及BIP44
通過這種分層(樹狀結(jié)構(gòu))推導(dǎo)出來的秘鑰,通常用路徑來表示,每個(gè)級(jí)別之間用斜杠 / 來表示,由主私鑰衍生出的私鑰起始以“m”打頭。因此,第一個(gè)母密鑰生成的子私鑰是m/0。第一個(gè)公共鑰匙是M/0。第一個(gè)子密鑰的子密鑰就是m/0/1,以此類推。
BIP44則是為這個(gè)路徑約定了一個(gè)規(guī)范的含義(也擴(kuò)展了對(duì)多幣種的支持),BIP0044指定了包含5個(gè)預(yù)定義樹狀層級(jí)的結(jié)構(gòu):m / purpose' / coin' / account' / change / address_index
m是固定的, Purpose也是固定的,值為44(或者 0x8000002C)
Coin type
這個(gè)代表的是幣種,0代表比特幣,1代表比特幣測(cè)試鏈,60代表以太坊
完整的幣種列表地址:https://github.com/satoshilabs/slips/blob/master/slip-0044.md
Account
代表這個(gè)幣的賬戶索引,從0開始
Change
常量0用于外部(收款地址),常量1用于內(nèi)部(也稱為找零地址)。外部用于在錢包外可見的地址(例如,用于接收付款)。內(nèi)部鏈用于在錢包外部不可見的地址,用于返回交易變更。 (所以一般使用0)
address_index
這就是地址索引,從0開始,代表生成第幾個(gè)地址,官方建議,每個(gè)account下的address_index不要超過20
根據(jù)?EIP85提議的討論以太坊錢包也遵循BIP44標(biāo)準(zhǔn),確定路徑是m/44'/60'/a'/0/n
a 表示帳號(hào),n 是第 n 生成的地址,60 是在?SLIP44 提案中確定的以太坊的編碼。所以我們要開發(fā)以太坊錢包同樣需要對(duì)比特幣的錢包提案BIP32、BIP39有所了解。
一句話概括下BIP44就是:給BIP32的分層路徑定義規(guī)范
BIP39
BIP32 提案可以讓我們保存一個(gè)隨機(jī)數(shù)種子(通常16進(jìn)制數(shù)表示),而不是一堆秘鑰,確實(shí)方便一些,不過用戶使用起來(比如冷備份)也比較繁瑣,這就出現(xiàn)了BIP39,它是使用助記詞的方式,生成種子的,這樣用戶只需要記住12(或24)個(gè)單詞,單詞序列通過 PBKDF2 與 HMAC-SHA512 函數(shù)創(chuàng)建出隨機(jī)種子作為 BIP32 的種子。
可以簡(jiǎn)單的做一個(gè)對(duì)比,下面那一種備份起來更友好:
// 隨機(jī)數(shù)種子
090ABCB3A6e1400e9345bC60c78a8BE7
// 助記詞種子
candy maple cake sugar pudding cream honey rich smooth crumble sweet treat
使用助記詞作為種子其實(shí)包含2個(gè)部分:助記詞生成及助記詞推導(dǎo)出隨機(jī)種子,下面分析下這個(gè)過程。
生成助記詞
助記詞生成的過程是這樣的:先生成一個(gè)128位隨機(jī)數(shù),再加上對(duì)隨機(jī)數(shù)做的校驗(yàn)4位,得到132位的一個(gè)數(shù),然后按每11位做切分,這樣就有了12個(gè)二進(jìn)制數(shù),然后用每個(gè)數(shù)去查BIP39定義的單詞表,這樣就得到12個(gè)助記詞,這個(gè)過程圖示如下:
(圖來源于網(wǎng)絡(luò))
下面是使用bip39生成生成助記詞的一段代碼:
var bip39 = require('bip39')
// 生成助記詞
var mnemonic = bip39.generateMnemonic()
console.log(mnemonic)
助記詞推導(dǎo)出種子
這個(gè)過程使用密鑰拉伸(Key stretching)函數(shù),被用來增強(qiáng)弱密鑰的安全性,PBKDF2是常用的密鑰拉伸算法中的一種。
PBKDF2基本原理是通過一個(gè)為隨機(jī)函數(shù)(例如 HMAC 函數(shù)),把助記詞明文和鹽值作為輸入?yún)?shù),然后重復(fù)進(jìn)行運(yùn)算最終產(chǎn)生生成一個(gè)更長的(512 位)密鑰種子。這個(gè)種子再構(gòu)建一個(gè)確定性錢包并派生出它的密鑰。
密鑰拉伸函數(shù)需要兩個(gè)參數(shù):助記詞和鹽。鹽可以提高暴力破解的難度。 鹽由常量字符串 "mnemonic" 及一個(gè)可選的密碼組成,注意使用不同密碼,則拉伸函數(shù)在使用同一個(gè)助記詞的情況下會(huì)產(chǎn)生一個(gè)不同的種子,這個(gè)過程圖示圖下:
(圖來源于網(wǎng)絡(luò))
同樣代碼來表示一下:
var hdkey = require('ethereumjs-wallet/hdkey')
var util = require('ethereumjs-util')
var seed = bip39.mnemonicToSeed(mnemonic, "pwd");
var hdWallet = hdkey.fromMasterSeed(seed);
var key1 = hdWallet.derivePath("m/44'/60'/0'/0/0");
console.log("私鑰:"+util.bufferToHex(key1._hdkey._privateKey));
var address1 = util.pubToAddress(key1._hdkey._publicKey, true);
console.log("地址:"+util.bufferToHex(address1));
console.log("校驗(yàn)和地址:"+ util.toChecksumAddress(address1.toString('hex')));
校驗(yàn)和地址是EIP-55中定義的對(duì)大小寫有要求的一種地址形式。
密碼可以作為一個(gè)額外的安全因子來保護(hù)種子,即使助記詞的備份被竊取,也可以保證錢包的安全(也要求密碼擁有足夠的復(fù)雜度和長度),不過另外一方面,如果我們忘記密碼,那么將無法恢復(fù)我們的數(shù)字資產(chǎn)。
一句話概括下BIP39就是:通過定義助記詞讓種子的備份更友好
我為大家錄制了一個(gè)視頻:以太坊去中心化網(wǎng)頁錢包開發(fā),從如何創(chuàng)建賬號(hào)開始,深入探索BIP32、BIP44、BIP39等提案,以及如何存儲(chǔ)私鑰、發(fā)送離線簽名交易和Token。
小結(jié)
HD錢包(Hierarchical Deterministic Wallets)是在BIP32中提出的為了避免管理一堆私鑰的麻煩提出的分層推導(dǎo)方案。
而BIP44是給BIP32的分層增強(qiáng)了路徑定義規(guī)范,同時(shí)增加了對(duì)多幣種的支持。
BIP39則通過定義助記詞讓種子的備份更友好。文章來源:http://www.zghlxwxcb.cn/news/detail-788878.html
目前我們的市面上單到的以太幣、比特幣錢包基本都遵循這些標(biāo)準(zhǔn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-788878.html
到了這里,關(guān)于區(qū)塊鏈的兩個(gè)核心概念之一簽名, 另一個(gè)是共識(shí).的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!