Hyperledger Indy 理解
Hyperledger Indy 的優勢和不足:
在 Sovrin 架構中,每個 DID 都有一個對應的專用代理程序,該程序具有自己的匿名網絡地址,身份所有者可以從該地址通過加密的專用通道與另一個身份所有者交換可驗證聲明和其他任何數據。默認設置用戶數據有選擇地公開。Sovrin 的可驗證聲明使用加密的零知識證明,因此它們可以自動支持數據最小化。
雖然解決了區塊鏈的數據存儲量不足、用戶隱私保護等問題,在技術上取得了有效的突破與進展,但是無法解決現實世界與數字世界身份對應的問題,項目后續實施推廣的難度較大,可能需要與政府權威部門合作并讓其充當驗證人的角色,后續 Sovrin 項目在企業之間發展聯盟鏈有可能是一個不錯的選擇。
以上內容來自:去中心化身份
以下內容來自:Hyperledger Indy:一個使用 Libindy 構建 Indy 客戶端的開發指南
看得很懵,嘗試理一理。
背景就忽略了,簡單來說就是學生Alice、Faver大學、銀行Thrift想要使用Indy上的身份進行交互。
這個一個Demo環境,我理解為搭建一個私鏈來進行模擬。步驟如下:
1.初始化環境,也就是下載安裝Sovrin區塊鏈,和以太坊一樣,通過修改配置文件比如修改網絡id搭建一個私鏈。配置文件里還需要配置Steward角色,中文翻譯為管家,他們管理著這個區塊鏈。配置的這些Steward在生成區塊鏈后會寫在創世區塊中。
2, agent,我理解為一個客戶端應用程序,這個應用程序可以跟Sovrin區塊鏈進行交互。每個agent都有自己的配置文件,稱為pool configuration。這個pool configraton應該指明這個agent連接的是哪個區塊鏈(也稱之為節點池),就行以太坊通過網絡id號來連接測試鏈或者本地私鏈一樣。那么我們這一步要做的就是下載安裝一個agent,這個agent是一個管家agent,安裝在管家的計算機上,管家通過這個agent來管理這個區塊鏈。修改配置文件,使這個agent根據區塊鏈的名稱和配置文件來連接到區塊鏈。如下:
3.這個agent應該使用錢包來管理它的DID相關信息。因此我們調用sdk需要生成一個錢包。
4. 這個agent目前還是一個普通的agent,但是它想要成為管家,來行使管家的權限,就要獲得他管家的身份,那么管家的相關數據被寫在了創世區塊中,可以通過之前約定好的seed來獲取管家的身份,這個seed在區塊鏈創建之前已經分配給了各個管家企業。以下是通過seed生成管家的DID。那么到這一步,這個區塊鏈的管理者–管家就確定下來了。
5.現在Alice或者其它組織想要在鏈上創建賬號,也就是DID,那改怎么操作呢?首先得下個agent客戶端,然后讓鏈上的用戶幫他進行創建。鏈上的用戶被稱為Trust Anchor角色,只有Trust Anchor角色才能操作賬本,也就是創建DID。現在區塊鏈剛創建,唯一的Trust Anchor就是管家steward了。以下的例子就是faber大學通過Steward來獲取一個DID.這個操作也叫onboarding。
6.一個Onboarding操作需要雙方也就是Steward和Faber大學各建一個DID,這個DID是一個 Pairwise-Unique Identifiers(DIDs)對(pair)。一個 DID 是由與之連接的一方所有,第二個應該是另一方所有。這個DID是為了建立連接使用的。
首先,Steward創建一個DID,就稱為steward_faber_did。
這個steward_faber_did有什么用呢,可以用來生成連接請求。把連接請求放到了鏈上。生成連接請求方式如下:
注意要往鏈上寫數據還得使用管家的DID才行。這個連接請求被放在鏈上,nym_request請求還有一個參數Nonce。這個Nonce是一個大隨機數,代表著Steward和Faber之間唯一的連接號。
Steward把請求放到了鏈上,還得告訴Faber他生成的did和nonce是多少,于是他搞了這么一個connection_request文件發送給Faber.
7.現在到Faber創建他的連接DID了。前提是他已經安裝好了agent。首先他得創建一個錢包才能創建DID。然后跟Steward一樣調用did.create_and_store_my_did方法創建一個連接用的DID.
創建錢包:
創建和Steward連接用DID,稱為faber_steward_did:
Faber還需要使用Steward的steward_faber_did的steward_faber_key。于是向賬本請求,也就是從區塊鏈上獲取,雖然他沒有寫的權限,但是讀應該可以。獲取steward_faber_key:
connection_request[‘did’]應該是Steward發給Faber的connection_request文件中的did。這個did數據之前第6步的時候已經被Steward放到了鏈上。
這個steward_faber_verkey就是這個did的公鑰。這個公鑰是拿來加密用的。加密什么東西呢?
Faber還需要創建一個連接反饋,這個連接返回包含自己創建的did和Steward之前生成的Nonce。連接反饋如下:
使用steward_faber_verkey對這個連接反饋進行加密,發給Steward,因為私鑰在Steward手上。
對連接反饋加密:
Steward解密后驗證發過來的nonce值和自己生成的nonce值是否一樣:
如果一樣,就證明了Steward手里的Faber的私鑰是正確的,同時Faber手里的Steward的私鑰也是正確的,因為他是從鏈上請求得來的。
證明了Faber的私鑰是正確的以后,Steward把faber的私鑰放在鏈上,之后他們就可以通過訪問區塊鏈拿到對方的公鑰來進行加密了!
把Faber創建的公鑰和did放在鏈上:
有了對方的公鑰,他們可以放心交流了,這種方法我能想到的好處是沒有使用CA來確定公鑰!
8.下一步Faber要干嘛呢,他得生成一個Verinym類型的DID,這個DID代表著他的法律身份。
和之前一樣生成一個新的DID:
然后把這個DID封裝成faber_did_info文件:
封裝好了進行加密:
這個加密算法使用了Steward的公鑰和自己的公鑰。
加密好了私下發給Steward,Steward進行解密:
解密后得到了Faber新生成的DID數據,也就是faber_did_info文件,里面是包含了DID和這個DID的公鑰。
Steward需要確認的是Faber發過來的DID和這個DID對應的的公鑰是不是正確的,也就是說,DID和DID對應的公鑰是有聯系的,通過DID和計算出它對應的公鑰。
首先Steward通過Faber發過來的DID號計算對應的公鑰:
然后跟Faber發過來的公鑰對比一下看有沒有造假情況:
確定沒問題后Steward向賬本發送創造DID交易,雖然是給Faber創造的,但是這個DID的owner還是Faber的,因為這個DID的私鑰和公鑰都在Faber的手上。現在,Faber終于擁有了自己真正的DID了。
如法炮制,Alice、Thrift銀行也可以申請自己的DID。
接下來:
政府部門的操作:
政府(權威部門)生成Credential Schema。包括transcript_schema_id和對應的transcript_schema,也就是證件所包括的數據項的模板文件。
政府部門把transcript_schema發布到賬本上。
-----------------------------------------------------------------------------------------------------------------------------------------------
Faber的操作:
Faber通過transcript_schema_id創建獲得transcript_schema的請求,請求發到鏈上獲得transcript_schema。這個時候鏈上會記錄faber_did申請獲取了一次transcript_schema。
Faber通過transcript_schema創建一個Credential Definnition,一個Credential Definnition包括faber_transcript_cred_def_id和對應的faber_transcript_cred_def_json
把Faber_transcript_cred_def_json存到錢包中。然后還把faber_transcript_cred_def_json發送到賬本(區塊鏈)中。
Faber根據Credential Definnition中的faber_transcript_cred_def_id,創建了一個Credential Offer(transcript_cred_offer_json)。這個json文件里邊包括了schema_id和faber_transcript_cred_def_id。存放在自己錢包中。
faber把Credential Offer發送給Alice
Alice的操作:
Alice以之前和faber建立的通信did,也就是alice_faber_did,和Faber發過來的Credential Offer中的schema_id獲取transcript_schema。
為什么不直接像Faver那樣直接通過transcript_schema_id來獲取,難道Alice沒有transcript_schema_id?那Alice直接給不就完事了嗎?為什么要使用alice_faber_did這個did呢
Alice創建一個Master Secret。這么Maste Secret用來證明你擁有了某個Credential。
Alice從Credential Offer中拿到cred_def_id,根據cred_def_id從賬本中獲取Faber創建的Credential Definition。還是使用alice_faber_did這個did 從賬本上獲取。
好了,Alice現在已經可以集齊七龍珠了,可以生成請求信息,來請求Faber大學生成的成績單了?Alice的七龍珠是,和Faver溝通用的did,Scheme_id,faber_transcript_cred_def_id,他創建的master_secret。
生成的請求包括:transcript_cred_request_json、transcript_cred_request_metadata_json。有了這兩個東西就可以請求憑證了!
faber給Scheme附上數據,生成transcript_cred_values。然后通過給Alice的Credential Offer和Alice生成的憑證定義請求文件transcript_cred_request_json,加上帶有數據的憑證transcript_cred_values生成了一個transcript_cred_json,也就是最后的帶有數據的憑證。
Alice目前擁有了
憑證定義請求文件transcript_cred_request_json,
憑證定義請求元數據transcript_cred_request_metadata_json,
上一步Faber生成后給的憑證數據 transcript_cred_json
Faber之前給的憑證定義文件faber_transcript_cred_def
把這些,放在自己的錢包中。作為真實的憑證。
截止目前:
1.政府把憑證模板放到了鏈上。
2.faber根據憑證模板制作了Credential Definition,把Credential Definition存到了鏈上,又根據Credential Definition制作了Credential Offer,把Credential Offer加密交給了Alice.
3.Alice拿到了Credential Offer,根據Credential Offer,他們可以拿到憑證模板(好像沒什么用),4.Alice創建一個Master Secret。Alice根據Credential Offer從鏈上拿到了Credential Definition。
5.Faber大學給憑證模板寫上數據。
6.Alice想申請這個憑證數據,它需要向Faber大學提供:Credential Offer、和Faber大學通信的DID,即alice_faber_did,Credential Definition,alice_master_secret。
總結
以上是生活随笔為你收集整理的Hyperledger Indy 理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eID是个什么东西
- 下一篇: 数字身份的一些应用和方案