在數(shù)據(jù)安全性的背景下, 存儲在區(qū)塊鏈上的數(shù)據(jù)的不可變性非常重要. 當(dāng)人們談到 “區(qū)塊鏈?zhǔn)遣豢勺兊摹?時, 他們想表達(dá)什么? 在這篇文章中, 我將嘗試解釋其中的關(guān)鍵概念.
什么是不可變性?
不可變意味著某些事物隨著時間推移不發(fā)生改變或無法改變.
所以在我們的上下文中, 不可變性意味著一旦數(shù)據(jù)寫入?yún)^(qū)塊鏈, 任何人, 甚至是系統(tǒng)管理員都無法更改它. 這為審計提供了好處. 作為數(shù)據(jù)提供者, 你可以證明你的數(shù)據(jù)未被更改. 而作為數(shù)據(jù)接收者, 你可以確保數(shù)據(jù)從未被更改. 這對于金融交易數(shù)據(jù)庫很有用.
不變性是相對的. 例如, 如果我向一大群朋友發(fā)送一封電子郵件, 那么從我的角度來看, 這些數(shù)據(jù)是不變的. 要改變它, 我必須說服我朋友們刪除各自的電子郵件( 或者說服Gmail和運行存放著我朋友郵件數(shù)據(jù)的所有郵件服務(wù)器的人員 ). 在我看來, 該電子郵件是不可變的在我擁有它的控制權(quán)的時候 - 如果沒有協(xié)作和檢測風(fēng)險, 我不能取消發(fā)送或者撤銷它.
所以不變性是相對的, 并且涉及改變的難度.
私人數(shù)據(jù)庫
對于私人數(shù)據(jù)庫, 終端用戶(end-user, 或稱最終用戶)可能擁有只讀權(quán)限. 她無法更改該數(shù)據(jù)庫中某一行的內(nèi)容. 但是, 像系統(tǒng)管理員那樣具有 更高特權(quán)訪問權(quán)限的用戶可能可以更改數(shù)據(jù). 那么我們目前如何應(yīng)對不聽話的系統(tǒng)管理員為了他自己的利益而篡改數(shù)據(jù)的風(fēng)險呢? 在現(xiàn)有的系統(tǒng)和組織中, 我們嘗試創(chuàng)建責(zé)任分離機制, 以使沒有任何一個人可以在未被監(jiān)視的情況下做壞事.
例如, 管理員可能擁有更改數(shù)據(jù)庫的權(quán)限, 但日志可能存儲在另一個由其他人擁有和管理的系統(tǒng)上. 這些組織系統(tǒng)已經(jīng)將阻止個人進行變更的行為落實到位. 我們需要相信這種組織體系是有效. 然而, 沒有任何控制機制將數(shù)據(jù)的不可變性放在首位.
下面進入?yún)^(qū)塊鏈正題.
區(qū)塊鏈
區(qū)塊鏈本質(zhì)上是數(shù)據(jù)庫, 它具有一些預(yù)先商定的技術(shù)和業(yè)務(wù)邏輯標(biāo)準(zhǔn), 通過點對點協(xié)議(peer-to-peer)機制和預(yù)先商定的關(guān)于可以哪種新數(shù)據(jù)可以被添加的規(guī)則讓數(shù)據(jù)保持同步. 關(guān)于不變性, 有兩個關(guān)鍵理念有助于讓篡改易于檢測: 散列(hashes, 或稱哈希)和塊(blocks).
哈希
哈希函數(shù)是一種數(shù)學(xué)函數(shù), 把 數(shù)據(jù)變成數(shù)據(jù)的指紋的過程稱為 哈希. 它就像一個公式或算法, 接受輸入數(shù)據(jù)( 可以是任何數(shù)據(jù), 無論是整個大英百科全書, 還是數(shù)字'1' ), 并將其轉(zhuǎn)換為固定長度的散列值輸出, 散列值就代表數(shù)據(jù)的指紋. 哈希函數(shù)有很多種類型, 其中有一個通用而強大的哈希函數(shù)稱為SHA-256( 表示安全哈希算法 - 256位 )
當(dāng)你將數(shù)學(xué)函數(shù)應(yīng)用到短語“Hello from Bits on Blocks!”時, 你將得到以下指紋輸出: 389f9ef3822e5c88f4b140db82c459064711a52182a3e438b4ebc7ecda62b9bb. 指紋( 389f ... b9bb )被稱為輸入詞組的SHA-256哈希.
一個好的散列函數(shù)的兩個相關(guān)屬性是:
很難從哈希值反演出原始數(shù)據(jù)
如果輸入數(shù)據(jù)稍有變化, 哈希值將以不可預(yù)知的方式變化
哈希是區(qū)塊鏈安全性和不變性的基礎(chǔ). 你可以在這里使用他們.
塊
比特幣區(qū)塊鏈中的一個重要思想是, 交易在被添加到區(qū)塊鏈數(shù)據(jù)庫之前便被捆綁成塊. 塊中包含一些比特幣交易信息( 支付 )以及一些其他數(shù)據(jù), 包括前一個塊的散列值. 由于每個塊都包含前一個塊的散列值作為其數(shù)據(jù)的一部分, 因此會形成一個塊鏈.
使用引用先前的塊的塊創(chuàng)建分類交易賬是比在書賬中進行頁面編號更好的主意. 在一本用1,2,3等數(shù)字編號的書賬中, 很容易撕掉第40頁并用另一個交易略有不同的第40頁替換它. 該書的完整性保持不變, 第39,40,41頁依舊是第39,40,41頁 - 沒有變化. 此外, 頁碼“40”中沒有反映該頁面中的任何內(nèi)容, 頁碼中隱含著頁面的排序.
而在區(qū)塊鏈中, 不是引用塊號, 而是用它們的散列值引用塊, 并且每個塊明確指定它正在用于構(gòu)建的塊( 散列 ). 所以它看起來更像是:
散列值為66a045b45的塊( 使用散列值a2c064616構(gòu)建塊 ), 隨后是
散列值為8939a3c35的塊( 使用散列值66a045b45構(gòu)建塊 ), 隨后是
散列值為a41f02e92的塊( 使用散列值8939a3c35構(gòu)建塊 )
btCoin
因此, 塊通過引用前面塊的反映內(nèi)容的散列值來顯式排序, 而不是由與內(nèi)容無關(guān)的編號系統(tǒng)( 1,2,3 )隱式排序. 點擊查看比特幣區(qū)塊鏈內(nèi)部的更多細(xì)節(jié).
關(guān)鍵點
每個塊的散列值來自塊的內(nèi)容
每個塊指向的是前一個塊的散列值, 而非一個連續(xù)的數(shù)字
區(qū)塊鏈中的數(shù)據(jù)在內(nèi)部是一致的, 也就是說, 你可以對其執(zhí)行一些檢查, 如果數(shù)據(jù)和哈希值不匹配, 毫無疑問, 中間出現(xiàn)了一些修補.
隔離的區(qū)塊鏈數(shù)據(jù)
我們先來看看如果你將比特幣區(qū)塊鏈復(fù)制到一個USB存儲盤中( 現(xiàn)在大約是55GB, 所以仍然可以很容易地復(fù)制過去 )會發(fā)生什么情況. 在將其傳遞給其他人( 如監(jiān)管機構(gòu) )之前, 你可以如何處理這些信息? 你可以改變數(shù)據(jù)并且騙過他們嗎?
比特幣的區(qū)塊鏈擁有近400,000個區(qū)塊. 假設(shè)你從區(qū)塊鏈中200,000(也就是大約一半)的區(qū)塊中移除一筆交易, 試圖假裝有一筆付款從未發(fā)生. 會發(fā)生什么?
1. 塊的散列失敗
監(jiān)管者(regulator)在接收USB存儲器時可以做的第一件事是根據(jù)塊數(shù)據(jù)重新計算所有塊的哈希值, 并檢查提供的塊哈希值是否有效并與每個塊的內(nèi)容是否一致. 若存在差異, 則意味著塊中的交易信息與塊的散列值不匹配, 意味著塊已被篡改. 因此, 為了欺騙監(jiān)管機構(gòu), 你需要重新計算該塊的散列, 以使其與修改后的內(nèi)容保持一致.
2. 鏈條失效
然而, 這破壞了整條鏈. 請記住, 每個塊都包含前一個塊的哈希. 如果塊200,000的散列值發(fā)生變化, 則塊200,001將引用不再存在的塊散列值. 塊200,001將引用塊200,000的 舊散列值, 而不是其 新的散列值. 所以區(qū)塊鏈破裂, 這很明顯失敗了. 要讓區(qū)塊鏈不遭到破壞, 你需要在被篡改的塊之后重新編譯和重新哈希每個塊, 替換之前的塊哈希指針的內(nèi)容.
但是, 有一些安全措施可以使重建區(qū)塊鏈變得非常困難或不可能發(fā)生. 這些保護措施分別是基于區(qū)塊鏈添加機制和不同規(guī)則的區(qū)塊鏈, 并且存在兩個主要方案: 用于驗證工作的公共區(qū)塊鏈的目標(biāo)散列 ; 以及( 一些 )私人區(qū)塊鏈的特定簽名.
3.區(qū)塊鏈難以重建
對于像比特幣這樣的公開的證明工作(proof-of-work)區(qū)塊鏈, 存在挖礦困難的概念. 在比特幣中, 只有塊散列遵循某個嚴(yán)格的模式, 塊才被認(rèn)為是有效的 - 即散列值必須小于目標(biāo)數(shù), 通常被描述為“從一定數(shù)量的零開始”. 有關(guān)比特幣挖礦的更多細(xì)節(jié), 請參閱比特幣挖礦簡介.
因此, 你不僅需要重新計算塊的散列值, 還需要確保重新計算的散列值低于某個數(shù). 你需要通過重復(fù)調(diào)整塊內(nèi)容的另一部分( 稱為隨機數(shù) )來 重新挖掘塊, 直到找到小于目標(biāo)數(shù)的散列值為止. 這需要一些重要的計算能力. 然后你需要對每個后續(xù)塊執(zhí)行此操作. 通俗地說, 你需要從該塊開始重新挖掘整個區(qū)塊鏈. 鑒于生成滿足條件的有效哈希所需的大量計算工作量, 這將會產(chǎn)生問題, 此外, 鏈中的區(qū)塊越早, 你需要做的時間越長, 因為你有更多的區(qū)塊要去重新挖礦.
對于諸如Multichain的私人區(qū)塊鏈, 塊添加機制往往有點不同, 在塊添加者以隨機循環(huán)方式輪流添加塊的情況下設(shè)置規(guī)則而非依靠大量的證明工作, 并且每個塊需要由塊添加者進行數(shù)字簽名. 只有區(qū)塊鏈由一組有定義的參與者簽署, 區(qū)塊鏈才有效且被接受. 這意味著為了重新創(chuàng)建區(qū)塊鏈, 你需要知道來自其他塊添加者的私鑰. 竊取這些密鑰對于工作量證明的哈希來說是一個非常不同的挑戰(zhàn).
小結(jié)
如果你做了所有這些, 那么USB存儲器上的數(shù)據(jù)就會在內(nèi)部保持一致并且看起來像一個有效的區(qū)塊鏈. 但這只限于對 那些無法對照區(qū)塊鏈的其他副本進行檢查的人而言.
有多個副本的區(qū)塊鏈
以上所有內(nèi)容都假設(shè)記憶棒上的數(shù)據(jù)是監(jiān)管機構(gòu)所看到的 唯一版本. 假設(shè)你通過移除事務(wù)并重新創(chuàng)建全部都符合驗證條件的塊的哈希值來創(chuàng)建內(nèi)部一致的區(qū)塊鏈.
監(jiān)管機構(gòu)現(xiàn)在需要檢查區(qū)塊鏈的其他副本 - 并檢查某一個數(shù)字 - 最近區(qū)塊的散列值. 如果USB記憶棒上最近的一個塊的散列值與他們可以從任何其他( 非勾結(jié)的 )參與者發(fā)現(xiàn)的散列值不同, 那么監(jiān)管機構(gòu)可以立即發(fā)現(xiàn)有些事情正在發(fā)生, USB記錄棒上的數(shù)據(jù)不同于實時區(qū)塊鏈上的數(shù)據(jù).
監(jiān)管機構(gòu)甚至不需要 查看實時區(qū)塊鏈中的 數(shù)據(jù). 他們只需要查看最近某個塊的散列值.
換句話說, 嘗試創(chuàng)建虛假區(qū)塊鏈非常困難.
更改一個區(qū)塊鏈
如何嘗試更改你參與的區(qū)塊鏈中的現(xiàn)有數(shù)據(jù)? 你會如何嘗試得到在一個網(wǎng)絡(luò)中被其他人接受的修改區(qū)塊?
由于“最長鏈”規(guī)則是大多數(shù)區(qū)塊鏈共識的基礎(chǔ), 因此這依舊困難重重. 廣義地講, “最長鏈”規(guī)則就是作為一個參與者, 如果你看到多個有競爭力的有效鏈, 更愿意相信那個有更多塊的鏈.
因此, 如果你重新播送一個修正后的區(qū)塊200,000, 你實際上會創(chuàng)建一個比真實鏈( 其長度為400,000 )短得多的區(qū)塊鏈“分支”. 現(xiàn)在有兩個互相競爭的區(qū)塊鏈, 一個是包含你的修改區(qū)塊的200,000個區(qū)塊的區(qū)塊鏈, 另一個區(qū)塊是400,000個區(qū)塊長的區(qū)塊鏈. 現(xiàn)有的節(jié)點會接受你的塊( 如果它是有效的 ), 但是很快就把它忽略了, 因為他們已經(jīng)知道存在一個現(xiàn)有的更長的區(qū)塊鏈.
唯一的辦法是做出改變并創(chuàng)建一個更長的鏈, 需要大量的計算能力或其他塊添加者的私鑰( 取決于誰可以添加塊, 以及如何添加 ), 并推出一個全新的區(qū)塊鏈, 比現(xiàn)有的更長. 你需要大量的計算能力才能勝過像比特幣這樣的現(xiàn)有工作證明鏈.
即使你設(shè)法做到這一點, 雖然技術(shù)上你的新鏈條是有效的, 但實際上社區(qū)會注意到是否有一個區(qū)塊重新組織后比其他區(qū)塊鏈長; 這將會受到調(diào)查.
結(jié)論
在“離線”區(qū)塊鏈中更改數(shù)據(jù)非常困難, 更不用說實時區(qū)塊鏈了.
當(dāng)人們說區(qū)塊鏈?zhǔn)遣豢勺兊? 不是意味著數(shù)據(jù)不能改變, 他們意在表明在沒有合謀的情況下做出改變是非常困難的. 如果你試圖做出改變, 監(jiān)管者將很容易檢測到你的企圖. 區(qū)塊鏈的這種屬性對于存儲的數(shù)據(jù)的安全性具有積極和消極的影響, 而其擴展性也對數(shù)據(jù)隱私也有影響.
新聞熱點
疑難解答
圖片精選