TPAB(基于區塊鍊的防篡改架構)在我們設計的架構中,TPAB區塊鍊注重保證資料的完整性、防篡改性和原始出處;與傳統的區塊鍊賬本技術相比,TPAB區塊鍊更加注重交易資料的一緻性、共享性和智能合約方面。
3.1 TPAB整體架構
TPAB提供了由核心節點、聚合器和網關組成的安全基礎設施,用于建立TPAB簽名以實作資料完整性。
3.1.1網關層設施
第一層聚合伺服器是收集和處理來自用戶端的請求,然後将聚合請求發送到上遊伺服器的網關。網關是基礎設施中面向用戶端的部分,為用戶端提供TPAB服務。
網絡聚合哈希并分發簽名。每個聚合伺服器處理來自其下級伺服器的請求,将其添加到哈希樹中,并将本地根哈希發送給下一個更進階别的伺服器。
3.1.2聚合層設施
聚合伺服器層次結構為每一輪建立一個全局哈希樹。認證網絡(聚合網絡的一部分)提供了廣泛的目擊者通路月曆狀态和通路認證解決方案中使用的根哈希曆史。
3.1.3核心節點
核心叢集位于聚合網絡的頂端,運作分布式狀态機,并管理月曆。它每1秒(大約)計算一次頂級根哈希,使用分布式共識算法對其進行投票,并将頂級根哈希推薦給CHC.核心負責就每個聚合周期的頂級根哈希達成一緻,然後将其存儲在月曆資料庫中,結果傳回給聚合網絡。聚合和核心過程中使用的規則間隔周期(輪次)會産生一個精确的時間度量,該度量被嵌入到TPAB簽名中。
3.2 TPAB中的算法模型
3.2.1 哈希函數、默克爾樹
哈希函數(Hash function):又稱散列函數,是一種從任意資料中建立“資料指紋”的方式,可将任意長度的輸入值轉換為固定長度的輸出值,即哈希值,也稱散列值,通常為數字與字母的組合。本系統中采用了SHA-256(Secure Hash Algorithm 256)算法作為系統運作過程中哈希值的計算方法。哈希函數能夠給出資料的電子身份證明,簡化資料規模,確定資料在傳輸、定位、檢索等過程中的高效、準确,具有單向性、抗碰撞能力與防篡改的能力,具體表現為:
(1)單向性:哈希函數具有單向映射關系,即輸入與輸出值一一對應,但不可由輸出值反推輸入值的具體資料。在本區塊鍊檔案管理系統中,公有賬本中僅記錄了各表單相對應的哈希值,不可直接檢視表單中的資料。
(2)抗碰撞能力:兩個不同的輸入經映射後形成同一個摘要的現象在密碼學中稱為碰撞,哈希函數具有極強的抗碰撞能力。在本系統中,抗碰撞能力表現為對任意表單、審批動作等相關資訊,其轉換後對應的哈希值均不相同。
(3)防篡改能力:哈希函數具有極強的敏感性,輸入值的細微變化均可導緻其輸出的散列值的變化。以哈希函數SHA-256為例,有:
默克爾樹(Merkle tree):又稱哈希樹(hash tree),是一種二叉樹形資料結構,由一個根節點、一組中間節點、一組葉節點組成,每個葉節點均以資料塊的哈希值作為标簽,除了葉節點以外的節點則以其子節點标簽的加密哈希作為标簽。生成一個完整的默克爾樹需要遞歸地對一組節點進行哈希操作,并将生成的哈希節點插入到默克爾樹中,直到隻剩一個哈希節點,該節點就是默克爾樹的根,稱為默克爾根(Merkle root),也稱哈希根(Hash Root)。
3.2.2分布式哈希樹
TPAB的服務包括一個全局分布式哈希樹,其簡化版本如下圖所示。
哈希樹每秒建立和銷毀一次,樹是由地理上獨立的操作節點組成的層次結構,我們稱之為聚合層,每個節點都以異步聚合的方式運作,都從其子樹中接收哈希值,然後生成哈希樹,再将哈希根值傳送給多個父節點,聚合是無邊界的,運作在虛拟機或專用硬體之上,在TPAB系統中,有4層聚合層次結構。系統可接受的理論極限是每秒2的64次方個簽名。
3.2.3 聚合哈希鍊
聚合哈希鍊的目的是證明某個文檔哈希(簽名文檔)是全局聚合樹的一部分。聚合哈希鍊的元件是同級哈希,當按照給定的順序從左或從右加入時,最終将産生聚合哈希樹的根。
(1)AHC的多個執行個體
全局聚合樹由若幹個層次分明的聚合器組成。每個聚合器為該聚合器的子樹提供鍊。當連接配接在一起時,這些來自每個聚合器的鍊 "碎片 "形成了一個從文檔哈希到全局哈希樹根的完整鍊。聚合後的鍊(碎片)的計算輸出必須與下一個哈希鍊(碎片)的輸入相比對。
(2)聚合時間
聚合時間是檔案簽名時間,通常以秒為機關,從1970-01-01 00:00:00 UTC(即POSIX時間)開始表示,應該對應于月曆塊中注冊的全局聚合樹根哈希表示的時間。是以,它對所有通向根的AHC一起是相同的。這個特殊字段不受加密保護(由月曆區塊鍊提供),用于技術目的。例如,尋找用于簽名擴充的正确月曆區塊鍊。
(3) 輸入哈希
輸入的哈希值是哈希鍊計算的起點。在簽名中的 "最低 "聚合鍊的情況下,這就是簽名檔案的哈希值。輸入的哈希值将連接配接到右邊兄弟姐妹哈希值的左前角,結果将被哈希。後者将連接配接到下一個兄弟姐妹哈希層,直到計算出哈希鍊的最終輸出。
(4)中繼資料
左邊或右邊的連結可以是中繼資料,不一定是同級哈希。這用于将特定資訊嵌入到簽名哈希鍊中,并對該資訊進行加密保護。例如,每個聚合器(從Gateway開始)都會将用戶端的身份嵌入到哈希樹中。中繼資料有一個強制性屬性--用戶端ID,它隻是一個UTF-8的字元串。從加密的角度來看,中繼資料與樹中其他的哈希值是一樣的。也就是說,計算出的哈希值的來源也存儲在簽名中,以後可以檢索。
輸出的是一系列的身份資訊。比如下面的輸出。
user1 :: gatewayX :: aggregatorY :: aggregatorZ。
意味着當使用SDK的應用向TPAB網關請求簽名時,其使用者ID為user1。當網關計算本地樹并将請求發送到下一級聚合器時,它使用使用者 ID gatewayX。
3.2.4 月曆哈希鍊
TPAB簽名中的月曆散列鍊(CHC)的主要目的是證明某個簽名的簽名時間,以及確定長期的完整性。月曆哈希鍊将導緻一個被廣泛見證的事件。
CHC與AHC類似。由于月曆塊是由Core儲存和維護的,是以TPAB簽名的CHC元件隻有一個從輸入到公布值的哈希執行個體。簽名中(最高的)AHC 的輸出哈希必須與 CHC 的輸入哈希相比對。當首次獲得 TPAB 簽名時,其中的 CHC 是不完整的(或完全缺失),因為沒有簽名專用的釋放。
釋放的時間與CHC輸出哈希的時間相對應。如果哈希鍊的結果是釋放,則時間等于釋放時間。如果釋放時間不存在,或者簽名沒有延伸到釋放時間,則釋放時間隻顯示(不完整)CHC的輸出哈希的時間。
左右連結的作用與AHC完全相同--它們用于計算輸出哈希。
3.2.5 時間驗證算法
TPAB簽名的時間也以月曆哈希鍊的形狀編碼。 這使得能夠計算/驗證來自月曆哈希鍊的時間以及其導緻的釋出時間。 這種驗證由TPAB SDK執行,作為内部驗證政策的一部分。
3.2.5.1 建構月曆哈希樹
月曆區塊鍊(其中每個葉對應于一秒)的二叉樹以一定的确定性方式建構。以下示例樹用于說明建構過程:
樣本樹有13個葉子:
首先,采取8個最左邊的葉子,因為8是最小的數字,是2的小于或等于13的幂。這允許我們建構最大的完美二進制子樹(紫色)。
對剩餘的葉子反複應用相同的程式。在樣本樹的情況下,下一個子樹(藍色)由4個葉子形成(因為4是2和小于或等于5的幂的最大數字)。剩下的綠葉形成第三個子樹。
一旦形成了各個子樹,就将它們結合成一棵樹。這個過程從右起首先将綠色和藍色樹的根結合起來,然後結果與紫色樹的根結合。
這意味着以下内容适用于樹中的任何節點:
l 它的左子樹總是一個完美的二叉樹(葉數完全是2N)。
l 它的右子樹遵循與整個樹相同的結構,隻有較少數量的樹葉(例如其左子樹再次是完美的,右樹遵循與整個樹相同的結構等)。
3.2.5.2 尋找葉子的位置
以這種方式建構樹可以使用以下方式找到任何葉子的位置:
l 樹中總葉數; 和
l 從根節點到所需葉的路徑。
在上面的例子中,總數為13.如果我們想要查找或驗證B1的位置,從根節點到它的路徑将是RLLL(意味着從根部到達B1,我們将首先移動一次到右邊 然後向左移動3次)。
用于查找位置的算法使用提供的路徑從根節點周遊到所需的葉節點。 在周遊期間,在每個節點,很容易找到:
l 樹中的樹葉數,該節點是根節點; 和
l 左右子樹中的葉數。
3.2.5.3 子樹中的葉數
考慮到樹的建構方式,我們知道左子樹是一個完美的二叉樹。 是以,它必須有2N個葉子,其中N是最大的整數,使得2N小于總葉數。 示例:
總葉數 N 2N (左子樹中的葉必須小于總葉數)
13 3 8(<13)
16 3 8(<16)
18 4 16(<18)
在我們知道左子樹中的葉子之後,找到右子樹中的葉數是很容易的,因為我們知道葉子的總數 - 從先前的“疊代”,或者如果我們在根節點,這都是作為算法的輸入。
3.2.5.4 路徑搜尋
知道左右子樹中的葉數有助于縮小每個移動期望的葉節點的範圍,如下所示:
l 當我們在根節點時,我們知道B1的(基于0的位置)為0 .. 12。
l 當我們向右移動時,将範圍縮小到(0 + 8).. 12,因為左子樹中有8個葉,而B1不是其中之一。
l 當我們向左移動時,将範圍縮小到0 ..(12 - 5),因為右子樹中有5個葉,而B1不是其中之一。
一般來說,這意味着移動右邊會增加左邊子樹中的葉子數量的開始,左邊移動的左邊會将範圍的結尾減少右邊子樹中的葉子數。
3.2.5.5 算法說明
以Python編寫的以下遞歸函數findPosition找到由給定路徑指定的葉的位置。 幫助函數getLeftLeafCount用于擷取左子樹中的葉數。 請注意,樹中的葉數并沒有明确地作為參數給出,因為這可以從posMin和posMax計算出來。
# Recursively finds the position of a leaf node, given the
# minimum, maximum leaf positions and the path from the root
# to the leaf node in question.
def findPosition(posMin, posMax, path):
leafCountAtNode = posMax - posMin + 1
leftLeafCount = getLeftLeafCount(leafCountAtNode)
rightLeafCount = leafCountAtNode - leftLeafCount
print "Total leaf count " + str(leafCountAtNode) +
", left subtree " + str(leftLeafCount) +
", right subtree " + str(rightLeafCount) + "; posMin " +
str(posMin) + ", posMax " + str(posMax)
# If no more moves left, posMin and posMax have to be equal
if len(path) == 0:
assert(posMin == posMax)
return posMax
move = path[0]
if move == 'R':
posMin += leftLeafCount
elif move == 'L':
posMax -= rightLeafCount
else:
raise ValueError('Invalid move ' + move)
return findPosition(posMin, posMax, path[1:])
# Finds the number of leaves in the left subtree
# given the total number of leaves in the tree
def getLeftLeafCount(totalLeafCount):
# The answer is the largest power of 2 that's
# strictly less than the total number of leaves
# Keep computing successive powers of 2 until
# we reach or exceed the upper bound
leftLeafCount = 1
while leftLeafCount < totalLeafCount:
leftLeafCount = leftLeafCount << 1
# Now leftLeafCount >= totalLeafCount, so we have
# come one step too far, so we take one step back
leftLeafCount = leftLeafCount >> 1
return leftLeafCount
使用具有13個葉子的樣本樹,并找到路徑為RLLL的B1的0位置,得到以下結果:
>>> import tpabtime
>>> tpabtime.findPosition(0, 12, ['R','L','L','L'])
Total leaf count 13, left subtree 8, right subtree 5; posMin 0, posMax 12
Total leaf count 5, left subtree 4, right subtree 1; posMin 8, posMax 12
Total leaf count 4, left subtree 2, right subtree 2; posMin 8, posMax 11
Total leaf count 2, left subtree 1, right subtree 1; posMin 8, posMax 9
Total leaf count 1, left subtree 0, right subtree 1; posMin 8, posMax 8
8
3.2.5.5 時間驗證
将上述算法放在TPAB簽名和TPAB月曆區塊鍊的上下文中,我們可以使用以下方式驗證TPAB簽名的POSIX時間(自1970-01-01 00:00:00 UTC以來的秒數),POSIX出版時間P(假設TPAB簽名已擴充到本釋出)。
TPAB簽名中的月曆哈希鍊的形狀,它是從時間P建構的樹的根到對應于簽名時間的葉的路徑。由于最左邊的葉對應于從1970-01-01 00:00:00 UTC開始的0秒,下一個葉對應于從1970-01-01 00:00:00 UTC開始的1秒),POSIX時間等于0 葉的位置。 是以,我們可以輕易地利用上面的findPosition函數來查找POSIX時間:
def findTime(P, path):
# The leaves are numbered 0...P
return findPosition(0, P, path)
運作該函數時,我們得到與findPosition相同的輸出:
>>> tpabtime.findTime(12, ['R','L','L','L'])
3.2.6 增強的共識算法
共識協定定義是使分布式系統中的節點快速有效地達成資料的一緻性,即確定所有可靠節點以完全相同的順序執行共識結論中交易,達成資料一緻性,同時正确的用戶端發送的有效交易請求最終會被處理和應答。
TPAB區塊鍊平台的共識元件可內建多類共識算法實作共識機制。目前,TPAB區塊鍊系統中已實作的共識算法包括 PBFT ,下一步将會支援業界多類優秀算法。
PBFT(Practical Byzantine Fault Tolerance)共識協定支援系統中不超過 1/3 的節點容錯性。通過 PrePrepare、Prepare、Commit的三階段送出協定來實作網絡共識節點之間的交易資料的一緻性。TPAB區塊鍊提供的 PBFT 共識具有快速終止、恢複可靠、狀态同步等多項特性。實用拜占庭容錯系統(PBFT)降低了拜占庭協定的運作複雜度,從指數級别降低到多項式級别,使拜占庭協定在分布式系統中應用成為現實。
核心節點需采用一定的共識機制算法對需要記錄的資料進行同步。共識即共同的認識,共識機制算法即表示使參與各方實作一緻意見的算法規則。在本系統中,共識機制算法采用PBFT(Practical Byzantine Fault Tolerance)實用拜占庭容錯算法,其應用過程(公有鍊多采用POS權益證明機制,聯盟鍊采用PFT共識機制)
TPAB核心節點共識機制實作模式
3.2.7 國密算法支援、信創産業
相容使用國家密碼局審批的密碼算法,随機數發生器采用國家密碼局審批的實體噪聲源真随機數發生器,系統整體安全可靠,性能優異,架構合理。在TPAB項目中支援的摘要輸入算法包含SHA-256、SHA-512、SM3等但不限于以上算法。
摘要函數在密碼學中具有重要的地位,被廣泛應用在數字簽名,消息認證,資料完整性檢測等場景。摘要函數通常被認為需要滿足三個基本特性:單向、不可逆、固定大小、雪崩效應。
早期MD5算法和SHA-1算法存在碰撞攻擊方法,MD5算法和SHA-1算法不再是安全可靠的算法。SM3密碼摘要算法是中國國家密碼管理局2010年公布的商用密碼雜湊算法标準。SM3算法适用于商用密碼應用中的數字簽名和驗證,是在SHA-256基礎上改進實作的一種算法。SM3算法采用Merkle-Damgard結構,消息分組長度為512位,摘要值長度為256位。SM3算法的壓縮函數與SHA-256的壓縮函數具有相似的結構,但是SM3算法的設計更加複雜,比如壓縮函數的每一輪都使用2個消息字。
簡言之,其中SM3算法包含如下兩個部分:
1、分組,将需要加密的檔案轉為2進制,然後分組為512*K+448(K為任意整數,不夠用一個“1”和多個“0”補齊),再加上64位的檔案長度資訊構成512*(K+1)的分組
2、疊代運算,這裡有一個參數(256位)參與運算,初始值V(0)(文檔中叫做IV),疊代一次之後得到V(1),後面依次疊代得到V(1)、V(2)、V(3)……V(K)、V(K+1),V(K+1)也就是最終的雜湊值
疊代運算
資訊技術應用創新産業中,目前我們正在相容國産作業系統(如麒麟OS、UOS、普華OS、中科方德)、國産資料庫(如人大金倉、達夢、巨杉等)、伺服器(如中國長城、聯想、曙光、東華、海信等)和晶片(如鲲鵬、飛騰、龍芯、兆芯等),助力于更具有普遍适用性和廣泛的相容性。