以中本聰創(chuàng)立的比特幣為代表的數(shù)字貨幣近期發(fā)展迅猛,支撐比特幣實(shí)現(xiàn)去中心化的底層技術(shù)區(qū)塊鏈技術(shù)也在近兩年逐步走進(jìn)大眾視野。區(qū)塊鏈技術(shù)以其安全性、去中心性以及算法保證的可信性吸引了包括金融機(jī)構(gòu)、供應(yīng)鏈、能源等多領(lǐng)域的關(guān)注。
在正式進(jìn)入解析區(qū)塊鏈技術(shù)內(nèi)幕之前,本文將就區(qū)塊鏈中與隱私保護(hù)、安全相關(guān)的基礎(chǔ)算法進(jìn)行相應(yīng)介紹
1.哈希算法
1.1. 簡介
計(jì)算機(jī)行業(yè)從業(yè)者對哈希這個詞應(yīng)該非常熟悉,哈希能夠?qū)崿F(xiàn)數(shù)據(jù)從一個維度向另一個維度的映射,通常使用哈希函數(shù)實(shí)現(xiàn)這種映射。通常業(yè)界使用y = hash(x)的方式進(jìn)行表示,該哈希函數(shù)實(shí)現(xiàn)對x進(jìn)行運(yùn)算計(jì)算出一個哈希值y。
區(qū)塊鏈中哈希函數(shù)特性:
- 函數(shù)參數(shù)為string類型;
- 固定大小輸出;
- 計(jì)算高效;
優(yōu)點(diǎn):
- collision-free 即沖突概率小:
x != y => hash(x) != hash(y) - 能夠隱藏原始信息:
例如區(qū)塊鏈中各個節(jié)點(diǎn)之間對交易的驗(yàn)證只需要驗(yàn)證交易的信息熵,而不需要對原始信息進(jìn)行比對,節(jié)點(diǎn)間不需要傳輸交易的原始數(shù)據(jù)只傳輸交易的哈希即可,常見算法有SHA系列和MD5等算法
1.2. 哈希的用法
哈希在區(qū)塊鏈中用處廣泛,其一我們稱之為哈希指針(Hash Pointer)
哈希指針是指該變量的值是通過實(shí)際數(shù)據(jù)計(jì)算出來的且指向?qū)嶋H的數(shù)據(jù)所在位置,即其既可以表示實(shí)際數(shù)據(jù)內(nèi)容又可以表示實(shí)際數(shù)據(jù)的存儲位置。下圖為Hash Pointer的示意圖

HashPointer在區(qū)塊鏈中主要有兩處使用,第一個就是構(gòu)建區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)。了解區(qū)塊鏈的讀者應(yīng)該知道區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)由創(chuàng)世區(qū)塊向后通過區(qū)塊之間的指針進(jìn)行連接,這個指針使用的就是圖示的HashPointer.每個區(qū)塊中都存儲了前一個區(qū)塊的HashPointer。這樣的數(shù)據(jù)結(jié)構(gòu)的好處在于后面區(qū)塊可以查找前面所有區(qū)塊中的信息且區(qū)塊的HashPointer的計(jì)算包含了前面區(qū)塊的信息從而一定程度上保證了區(qū)塊鏈的不易篡改的特性。第二個用處在于構(gòu)建Merkle Tree. Merkle Tree的各個節(jié)點(diǎn)使用HashPointer進(jìn)行構(gòu)建,關(guān)于區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)以及MerkleTree的內(nèi)容我們在后續(xù)文章中進(jìn)行進(jìn)一步介紹。
哈希還在其他技術(shù)中有所應(yīng)用例如:交易驗(yàn)證以及數(shù)字簽名等等。
2.加密算法
2.1簡述
加密簡單而言就是通過一種算法手段將對原始信息進(jìn)行轉(zhuǎn)換,信息的接收者能夠通過秘鑰對密文進(jìn)行解密從而得到原文的過程。按照加密方和解密方秘鑰相同與否可以將加密算法大致分為三種子類型:
-
對稱加密
對稱加密的加密解密方使用相同的秘鑰,這種方式的好處在于加解密的速度快但是秘鑰的安全分發(fā)比較困難,常見對稱加密算法有DES,AES,... -
非對稱加密
非對稱加密體系也稱為公鑰體系,加解密時加密方擁有公鑰和私鑰,加密方可以將公鑰發(fā)送給其他相關(guān)方,私鑰嚴(yán)格自己保留。例如銀行的頒發(fā)給個人用戶的私鑰就存儲在個人的U盾里;非對稱加密中可以通過私鑰加密,他人能夠使用公鑰進(jìn)行解密,反之亦然;非對稱加密算法一般比較復(fù)雜執(zhí)行時間相對對稱加密較長;好處在于無秘鑰分發(fā)問題。常見的其他非對稱加密算法有RSA,ECC,區(qū)塊鏈中主要使用ECC橢圓曲線算法。
3.對稱加密與非對稱加密的結(jié)合
這種方式將加密過程分為兩個階段,階段一使用非對稱加密進(jìn)行秘鑰的分發(fā)使得對方安全地得到對稱加密的秘鑰,階段二使用對稱加密對原文進(jìn)行加解密。

2.2 數(shù)字簽名
數(shù)字簽名又稱之為公鑰數(shù)字簽名,是一種類似于寫在紙上的物理簽名。數(shù)字簽名主要用于數(shù)據(jù)更改的簽名者身份識別以及抗抵賴。數(shù)字簽名包含三個重要特性:
- 只有自己可以簽署自己的數(shù)字簽名,但是他人可以驗(yàn)證簽名是否是你簽發(fā);
- 數(shù)字簽名需要和具體的數(shù)字文檔綁定,就好比現(xiàn)實(shí)中你的簽名應(yīng)該和紙質(zhì)媒介綁定;
- 數(shù)字簽名不可偽造;
依賴非對稱加密機(jī)制可以較容易實(shí)現(xiàn)上述三種特性。首先,需要生成個人的公私鑰對:
(sk, pk) := generateKeys(keysize),sk私鑰用戶自己保留,pk公鑰可以分發(fā)給其他人
其次,可以通過sk對一個具體的message進(jìn)行簽名:
sig := sign(sk, message)這樣就得到了具體的簽名sig
最后,擁有該簽名公鑰的一方能夠進(jìn)行簽名的驗(yàn)證:
isValid := verify(pk, message, sig)
在區(qū)塊鏈體系中每一條數(shù)據(jù)交易都需要簽名,在比特幣的設(shè)計(jì)過程中直接將用戶的公鑰來表征用戶的比特幣地址。這樣在用戶發(fā)起轉(zhuǎn)賬等比特幣交易時可以方便的進(jìn)行用戶交易的合法性驗(yàn)證。
2.3 數(shù)字證書和認(rèn)證中心
2.3.1 數(shù)字證書(Digital Certificate)
數(shù)字證書又稱“數(shù)字身份證”、“網(wǎng)絡(luò)身份證”是經(jīng)認(rèn)證中心授權(quán)頒發(fā)并經(jīng)認(rèn)證中心數(shù)字簽名的包含公開秘鑰擁有者及公開秘鑰相關(guān)信息的電子文件,可以用來判別數(shù)字證書擁有者身份。
數(shù)字證書包含:公鑰、證書名稱信息、簽發(fā)機(jī)構(gòu)對證書的數(shù)字簽名以及匹配的私鑰
證書可以存儲在網(wǎng)絡(luò)中的數(shù)據(jù)庫中。用戶可以利用網(wǎng)絡(luò)彼此交換證書。當(dāng)證書撤銷后,簽發(fā)此證書的CA仍保留此證書的副本,以備日后解 決可能引起的糾紛。
2.3.2 認(rèn)證中心(Certificate Authority)
認(rèn)證中心 一般簡稱CA, CA一般是一個公認(rèn)可信的第三方機(jī)構(gòu),其作用主要是為每個用戶頒發(fā)一個獨(dú)一無二的包含名稱和公鑰的數(shù)字證書。
2.4 常見加密算法的對比
