- 區塊鏈架構之美:從比特幣、以太坊、超級賬本看區塊鏈架構設計
- 何昊編著
- 3363字
- 2021-07-23 17:31:09
1.6 數字簽名
在現實世界中,在文件上手書簽名已經長期被用作原作者的證明,或者用來表示同意文件所列的條款。簽名所代表的不可辯駁的事實有以下幾點。
? 簽名是不可偽造的,簽名是簽名者慎重簽在文件上的證明。
? 簽名是可信的,簽名使文件的接收者相信文件已由簽名者慎重簽名。
? 簽名是不可再用的,簽名是文件的一部分,不擇手段的人不能把簽名移到不同的文件上。
? 簽名文件是不可改變的,文件簽名后內容就不能發生改變。
? 簽名是不可否認的,簽名和文件是一個物理事件,簽名者以后不能宣布自己沒簽名。
實際上,上面所述事實沒有一個完全是真的,因為難以檢測簽名是否被偽造或被復制。文件在簽名后可以篡改,甚至有時候簽名者在不知情的情況下,被欺騙完成了對文件的簽名,但是考慮到這些欺騙的困難程度和被檢測發現后造假者所需承擔的責任,我們仍愿接受這些威脅,相信簽名是原作者的證明。
要想在計算機上簽名,有很多問題需要解決。首先,數字信息容易復制,在計算機中把一個文件的有效簽名信息移動到另一個文件中非常容易,傳統方式的簽名毫無意義。其次,簽名后仍然容易修改文件,并且可以不留下任何修改的痕跡。
因此,我們需要一種方法可以將簽名者的身份信息綁定到代表文檔的整個二進制數據上,并且該操作不可撤銷,這種方法就是數字簽名。
數字簽名(Digital Signature,又稱公鑰數字簽名)的功能和我們在紙質文件上的簽名類似,但是使用了公鑰加密領域的技術,是一種用于鑒別數字信息真偽的方法。一套數字簽名通常會定義兩種互補的運算,一種用于簽名,另一種用于驗證。通常來說,私鑰用來簽名,簽名后的消息表示簽名者對該消息的內容負責,公鑰用來驗證簽名的正確性。數字簽名使用了消息摘要和非對稱加密技術,可以保證接收者能夠核實發送者對消息的簽名,發送者事后不能抵賴對消息的簽名,接收者不能篡改消息內容或偽造對消息的簽名。
假設Alice向Bob發送一條消息,Alice首先對消息生成一個消息摘要,生成消息摘要后對該消息用私鑰進行簽名并將簽名信息附帶在消息的最后,然后將消息和簽名發送給Bob。Bob收到消息后用同樣的算法生成消息摘要,然后拿Alice的公鑰驗證這個消息摘要,驗證通過則表明消息確實是Alice發來的。Alice的公鑰可以放在網站上讓大家獲得,或者發郵件告知大家。通過數字簽名可以確保三點:①確認信息是由簽名者發送的;②確認信息從簽發到接收沒有被修改過,包括傳輸中的中間人修改;③確認信息在傳輸過程中沒有發生丟失。
數字簽名的全過程分為兩部分,即簽名與驗證,驗證的過程與簽名的過程類似。以下列舉了數字簽名的步驟。
? 發送者要發送消息,運用散列函數(MD5、SHA1等)生成消息摘要。
? 發送者用自己的私鑰對消息摘要進行加密,形成數字簽名。
? 發送者將數字簽名附帶在消息最后發送給接收者。
? 接收者用發送方的公鑰對簽名信息進行解密,得到消息摘要。
? 接收者以相同的散列函數對接收到的消息進行散列,也得到一個消息摘要。
? 接收者比較兩個消息摘要,如果完全一致,說明數據沒有被篡改,簽名真實有效,否則拒絕該簽名。
傳統數字簽名技術實現了基本的認證功能。然而,在一些區塊鏈的應用場景中,存在身份匿名、內容隱藏等特殊的隱私保護需求。這時就需要通過群簽名、環簽名或盲簽名等特殊的數字簽名技術實現。例如,在區塊鏈這樣的弱中心化或多中心化場景中,為了實現完全化的匿名,簽名者希望只需要自證其在一定的合法用戶范圍內,而不希望存在監管角色能夠反推出簽名者的身份,這時就需要采用群簽名技術。
1)多重簽名
多重簽名(Multi Signature)是數字簽名的一個重要應用方式,通常用于多個參與者對某消息、文件和資產同時擁有簽名權或支付權的場景。例如,有一份文件需要多個部門聯合簽字后方可生效。根據簽名順序的不同,多重簽名分為兩類,即有序多重簽名和廣播多重簽名。對于有序多重簽名來說,簽名者多次簽名是有一定的串行順序的,而廣播多重簽名沒有限制。若數字資產需要經過多重簽名確認后才能轉移,則會極大地提高資產的安全性。惡意攻擊者需要獲得至少一個私鑰才能盜用這些資產,降低了用戶無意間泄露私鑰所帶來的風險和損失,因此多重簽名在比特幣腳本和以太坊智能合約中都有廣泛的應用。
2)群簽名
1991年Chaum和Heyst首次提出群簽名(Group Signature)的概念,即某個群組內一個成員可以代表群組進行匿名簽名,簽名可以證明來自于該群組,卻無法確定來自于群組中的哪一個成員。群簽名方案的關鍵是群管理員,群管理員負責添加群成員,并且在發生爭議時揭示簽名者身份。在一些群簽名的設計方案中,添加群成員和撤銷簽名匿名性的責任被分開,分別賦予群管理員和撤銷管理員,但不管怎么說,所有方案都應該滿足基本的安全性要求。
3)環簽名
環簽名(Ring Signature)是由Ron Rivest、Adi Shamir和Yael Tauman三位密碼學家在2001年首次提出的。在環簽名中,簽名者首先會選定一個臨時的簽名者集合,集合中包括簽名者自身。然后簽名者利用自己的私鑰和集合中其他人的公鑰就可以獨立地產生簽名,無須其他設置。簽名者集合中的其他成員,可能并不知道自己已經被包含在最終的簽名者集合中。環簽名的安全屬性之一是,確定使用哪個成員的密鑰來生成簽名在計算上不可行。環簽名類似于群簽名,但在兩個關鍵方面有所不同:第一,無法撤銷單個簽名的匿名性;第二,任何用戶組都可以用作一個群。
4)盲簽名
盲簽名(Blind Signature)是在1982年由David Chaum提出的,是指簽名者在無法看到原始內容的前提下對消息進行簽名。一方面,盲簽名可以實現對所簽內容的保護,防止簽名者看到原始的內容。另一方面,盲簽名可以防止追蹤,簽名者無法將內容和簽名結果進行對應。
5)門限簽名
在1979年Shamir提出秘密分享技術后,Desmedt等人在1994年正式提出了門限密碼學的概念。在現有的門限簽名方案中,與單一公鑰所對應的私鑰被分享到多個成員,只有指定數目的成員共同協作,才能完成密碼操作(如解密、簽名)。正因為門限簽名方案的這種結構,門限密碼學被提出后受到廣泛的關注,被用于密鑰的托管、恢復、權力的分配等,也被賦予了更多的特性,如動態門限、子分片可公開驗證等。
近年來,門限密碼學在區塊鏈系統中逐漸被應用,分為門限加密和門限簽名。門限密碼學一般用于隨機預言機、防止審查、共識網絡中防拜占庭和分布式偽隨機數生成器(Coin Tossing)。門限密碼學優越的資產協同防盜特性慢慢被新興數字資產托管機構重視。本書主要討論公鑰密碼學中的門限簽名機制及原理。
與公鑰密碼學中的簽名機制類似,門限簽名機制也分為兩部分,分別是門限密鑰生成和門限密鑰簽名。
在進行門限密鑰生成時,需要依賴分布式密鑰產生(Distributed Key Generation,DKG)協議,該協議將多個參與者聯合起來,生成符合一定要求的總密鑰對和密鑰對份額。每一個參與者對應一個密鑰對份額,單個參與者只能知道部分密鑰,無法獲知總私鑰。
在進行門限密鑰簽名時,參與某次簽名的參與者將自己的私鑰作為隱私輸入,需要簽名的信息作為公共輸入,以此來進行一次多方參與的聯合簽名運算,最后得到簽名。在這個過程中,安全多方計算的隱私性保證了參與者并不能獲得其他參與者的私鑰信息,但都可以得到簽名。這個簽名與單個參與者用私鑰簽出的簽名一模一樣,在進行簽名驗證時,可以直接進行驗證而無須與其他參與者進行交互,簽名的驗證者甚至都無法感知到驗證的簽名是通過門限簽名的方式生成的。
通常我們在區塊鏈中看到的都是(t,n)門限簽名方案,該方案是指由n個成員組成一個簽名群體,該群體有一對公鑰和私鑰,群體內大于或等于t個合法并且誠實的成員組合可以代表群體用群私鑰進行簽名。任何人均可利用該群體的公鑰進行簽名驗證。這里t是門限值,只有大于或等于t個的合法成員才能代表群體進行簽名,群體中任何t-1個或更少的成員不能代表該群體進行簽名,同時任何成員不能假冒其他成員進行簽名。采用門限簽名方式可以實現權力分配,避免濫用職權。
到目前為止,讀者可能覺得門限簽名和之前提到的多重簽名非常相似,都是對于一個操作只需要部分參與者批準即可執行的,但實際上二者有著本質上的不同。
對于多重簽名來說,多個參與者使用不同的私鑰多次簽名,每個簽名之間互相獨立,最終的驗證是通過腳本或合約判斷每個簽名是否可以通過驗證的,需要進行多次驗證。而在門限簽名中,每個私鑰只是總私鑰的一部分,多個私鑰的多次簽名在鏈下完成,最終生成一個總的簽名,在驗證時只需要在鏈上驗證一次即可。但是無論是多重簽名還是門限簽名都可以幫助使用者分散風險,分配權力,使用時應依據具體的應用場景而定。
- Flask Blueprints
- Boost C++ Application Development Cookbook(Second Edition)
- 構建移動網站與APP:HTML 5移動開發入門與實戰(跨平臺移動開發叢書)
- Learning ArcGIS Pro 2
- HTML5游戲開發案例教程
- Instant QlikView 11 Application Development
- Amazon S3 Cookbook
- 程序員修煉之道:通向務實的最高境界(第2版)
- Python:Master the Art of Design Patterns
- Scala編程實戰(原書第2版)
- Microsoft Azure Storage Essentials
- 從零開始學C#
- Python開發基礎
- scikit-learn Cookbook(Second Edition)
- C語言程序設計