去中心化數字身份DID簡介——一、基本概念

本人最近正在研究數字身份DID技術,該技術在區塊鏈領域目前還比較冷門,並沒有什麼實際的應用案例,但是數字身份的應用場景廣闊,是一個必然會火起來的技術。於是打算寫幾篇文章,好好講一下其中涉及到的概念,技術實現和應用場景。先從基本概念講起:

身份:

國際電子技術委員會將“身份”定義爲“一組與實體關聯的屬性”。這裏的實體不僅僅是人,對於機器或者物體都可以是實體,甚至網絡中虛擬的東西也可以是實體並擁有身份。

數字身份:

隨着互聯網的出現和普及,傳統的身份有了另外一種表現形式,即數字身份。一般認爲,數字身份的演進經歷了四個階段,分別是:中心化身份、聯盟身份、以用戶爲中心的身份以及自 我主權身份。

  • 中心化身份是由單一的權威機構進行管理和控制的,現在互聯網上的大多數身份還是中心化身份。
  • 聯盟身份的出現解決了中心化身份中身份數據零碎混亂的弊端,此種身份是有多個機構或者聯盟進行管理和控制的,用戶的身份數據具備了一定程度的可移植性,例如允許用戶登錄某個網站時, 可以使用其他網站的賬戶信息,類似於 QQ、微信或者微博的跨平臺登錄。
  • 以用戶爲中心的身份則將重點集中在去中心化上,通過授權和許可進行身份數據的共享,例如OpenID。
  • 自我主權身份纔是真正意義上的去中心化的、完全由個人所擁有和控制的身份。

PKI體系:

Public Key Infrastructure 的縮寫,翻譯過來就是公鑰基礎設施,其主要功能是綁定證書持有者的身份和相關的密鑰對(通過爲公鑰及相關的用戶身份信息簽發數字證書),爲用戶提供方便的證書申請、證書作廢、證書獲取、證書狀態查詢的途徑,並利用數字證書及相關的各種服務(證書發佈,黑名單發佈,時間戳服務等)實現通信中各實體的身份認證、完整性、抗抵賴性和保密性。PKI體系的中心是CA服務器,CA服務器必須是安全的,可信任的。主要載體是X509格式的證書文件。

DID:

Decentralized IDentity去中心化身份,簡稱DID,相對於傳統的基於PKI的身份體系,基於區塊鏈建立的DID數字身份系統具有保證數據真實可信、保護用戶隱私安全、可移植性強等特徵,其優勢在於:

  • 去中心化:基於區塊鏈,避免了身份數據被單一的中心化權威機構所控制。
  • 身份自主可控:基於DPKI (分佈式公鑰基礎設施),每個用戶的身份不是由可信第三方控制,而是由其所有者控制,個人能自主管理自己的身份。
  • 可信的數據交換:身份相關數據錨定在區塊鏈上,認證的過程不需要依賴於提供身份的應用方。

DID標識:

DID標識是一個特定格式的字符串,用來代表一個實體的數字身份,這裏的實體可以是人、機、物。DID標識的格式爲:

UntitledImage

前綴did:是固定的,表示這個字符串是一個did標識字符串。
中間的example被稱爲DID方法,就是用來表示這個DID標識是用哪一套方案(方法)來進行定義和操作的。這個DID方法我們可以自定義,並且註冊到W3C的網站(https://w3c.github.io/did-spec-registries/#did-methods)中。
最後面的部分是在該DID方法下的唯一標識字符串。比如我們做了一個DID系統,我們把方法就起名叫cid吧,想把中國公民的身份證信息都DID化,那麼我的DID標識就是:
did:cid:5111**************5
這裏我們就使用身份證號碼作爲cid這個DID方法下的唯一標識。

DID文檔:

每一個DID標識都會對應一個DID文檔(DID Document)。這個文檔就是一個JSON字符串,裏面一般會包含如下信息:
DID文檔內容
描述
DID主題
DID標識符本身,也就是DID文檔所描述的該DID。由於DID的全局唯一特性,因此在DID文檔中只能有一個DID。
公鑰
公鑰用於數字簽名及其他加密操作,這些操作是實現身份驗證以及與服務端點建立安全通信等目的的基礎。如果 DID 文檔中不存在公鑰,則必須假定密鑰已被撤銷或無效,同時必須包含或引用密鑰的撤銷信息(例如,撤銷列表)。
身份驗證
身份驗證的過程是 DID 主題通過加密方式來證明它們與 DID 相關聯的過程。
授權
授權意味着他人代表 DID 主題執行操作,例如當密鑰丟失的時候,可以授權他人更新 DID 文檔來協助恢復密鑰。
服務端點
除了發佈身份驗證和授權機制之外,DID 文檔的另一個主要目的是爲主題發現服務端點。服務端點可以表示主題希望公告的任何類型的服務,包括用於進一步發現、身份驗證、授權或交互的去中心化身份管理服務。
時間戳
文檔創建時間和更新時間
以上信息並不是必須有,不過一般我們建議包含。我們來看一個具體的DID文檔示例:

{
"@context": "https://w3id.org/did/v1",
"id": "did:example:123456789abcdefghi",
"authentication": [{
// 本DID文檔對應的DID標識
"id": "did:example:123456789abcdefghi#keys-1",
"type": "RsaVerificationKey2018",
"controller": "did:example:123456789abcdefghi",
//本DID對應的公鑰信息
"publicKeyPem": "-----BEGIN PUBLIC KEY...END PUBLIC KEY-----\r\n"
}],
"service": [{
// 獲取本DID對應的VC的服務接口
"id":"did:example:123456789abcdefghi#vcs",
"type": "VerifiableCredentialService",
"serviceEndpoint": "https://example.com/vc/"
}]
}

個人覺得DID文檔中最重要的就是公鑰信息,這是我們接下來要進行VC和VP驗證的基礎。

我們一般是把DID標識作爲Key,把DID文檔作爲Value存儲到區塊鏈中,利用區塊鏈不可篡改、共享數據訪問的特點,實現接下來在驗證身份時能快速訪問獲取可信數據。

可驗證憑證/可驗證聲明

(Verifiable Claims 或 Verifiable Credentials,本文接下去都簡稱VC)是一個 DID 給另一個 DID 的某些屬性做背書而發出的描述性聲明,並附加自己的數字簽名,用以證明這些屬性的真實性,可以認爲是一種數字證書。
傳統的PKI數字證書體系需要CA來頒發,而在DID中也是分爲頒發者、持有者、驗證者、DID註冊系統(也就是區塊鏈),具體關係如圖:

UntitledImage

  • 頒發者Issuer就是證書的頒發機構,比如身份證就是公安機關作爲頒發者,畢業證書就是大學作爲頒發者。
  • 持有者Holder就是證書的持有人,就是我們這些普通人。
  • 驗證者Verifier就是在我們使用證書時查看我們證書的人或者機構。比如我們入住酒店,前臺要驗證我們的身份證,那麼酒店前臺就是驗證者;再比如我們入職新公司時需要提供大學畢業證書,新公司HR就是驗證者。
  • DID註冊系統Verifiable Data Registry就是我們存儲了DID標識和DID文檔的地方,通過DID標識可以查詢到對應的DID文檔。

當公安機關給我頒發了身份證,在DID中,這個身份證就是VC。一個VC也是一個JSON字符串,裏面包含如下信息:
UntitledImage

  • VC元數據,主要就是發行人、發行日期、聲明的類型等信息。
  • 聲明,一個或者多個關於主體的說明。比如身份證作爲公安機關頒發給我的VC,在聲明中會包含:姓名、性別、出生日期、民族、住址等信息。
  • 證明,通常就是頒發者的數字簽名,保證了本VC能夠被驗證,防止VC內容被篡改以及驗證VC的頒發者。

下面是官方給出的一個VC的具體樣例:

{
  // VC內容所遵循的JSON-LD標準
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  // 本VC的唯一標識,也就是證書ID
  "id": "http://example.edu/credentials/1872",
  // VC內容的格式
  "type": ["VerifiableCredential", "AlumniCredential"],
  // 本VC的發行人
  "issuer": "https://example.edu/issuers/565049",
  // 本VC的發行時間
  "issuanceDate": "2010-01-01T19:73:24Z",
  // VC聲明的具體內容
  "credentialSubject": {
    // 被聲明的人的DID
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    // 聲明的斷言內容
    "alumniOf": {
      "id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
      "name": [{
        "value": "Example University",
        "lang": "en"
      }, {
        "value": "Exemple d'Université",
        "lang": "fr"
      }]
    }
  },
  // 對本VC的證明
  "proof": {
    // 簽名算法
    "type": "RsaSignature2018",
    // 簽名創建時間
    "created": "2017-06-18T21:19:10Z",
    // 本證明的目的
    "proofPurpose": "assertionMethod",
    // 驗證本簽名的公鑰的ID
    "verificationMethod": "https://example.edu/issuers/keys/1",
    // 數字簽名的內容
    "jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5X
      sITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUc
      X16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtj
      PAYuNzVBAh4vGHSrQyHUdBBPM"
  }
}

因爲VC中具有用戶的隱私信息,所以VC一般保存在私有的存儲中,比如用戶自己的手機中,或者需要授權的網絡地址中。除了前面示例中給出的數據外,我們的VC還可以有失效日期,比如我們的身份證一般10年有效,過期後就需要重新向頒發者申請新的VC。

可驗證表達:

Verifiable presentation簡稱VP,可驗證表達是VC持有者向驗證者表名自己身份的數據。一般情況下,我們直接出示VC全文即可,但是在某些情況下,出於隱私保護的需要,我們並不需要出示完整的VC內容,只希望選擇性披露某些屬性,或者不披露任何屬性,只需要證明某個斷言即可。
比如一個求職者要進入某寫字樓面試,寫字樓的保安要求登記身份證號碼和姓名,但是我們的VC中還包含了民族、住址等信息,我們的求職者不希望將自己的住址暴露給保安,所以他提供給保安的VP中應該只選擇性的披露的身份證號碼和姓名,其他信息都不披露。
再比如我們規定必須年滿18歲纔有資格購買香菸,所以一個消費者在購買香菸時必須證明自己已經年滿18歲,但是直接出示身份證給收銀員又會暴露太多隱私信息,就算選擇性披露生日屬性,也會讓收銀員知道了消費者具體的年齡和生日日期,這種情況下消費者只希望在VP中證明自己大於18歲,其他什麼信息都不能暴露。
VP的格式爲:
UntitledImage

  • VP元數據,主要包含了版本,本JSON對象的類型等信息
  • VC列表,要對外展示的VC的內容,如果是選擇性披露或者隱私保護的情形,可能就不包含任何VC。
  • 證明,主要就是持有者對本VP的簽名信息

下面是官方給出的一個具體的VP的樣例:

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "type": "VerifiablePresentation",
  // 本VP包含的VC的內容
  "verifiableCredential": [{
    "@context": [
      "https://www.w3.org/2018/credentials/v1",
      "https://www.w3.org/2018/credentials/examples/v1"
    ],
    "id": "http://example.edu/credentials/1872",
    "type": ["VerifiableCredential", "AlumniCredential"],
    "issuer": "https://example.edu/issuers/565049",
    "issuanceDate": "2010-01-01T19:73:24Z",
    "credentialSubject": {
      "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
      "alumniOf": {
        "id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
        "name": [{
          "value": "Example University",
          "lang": "en"
        }, {
          "value": "Exemple d'Université",
          "lang": "fr"
        }]
      }
    },
    "proof": {
      "type": "RsaSignature2018",
      "created": "2017-06-18T21:19:10Z",
      "proofPurpose": "assertionMethod",
      "verificationMethod": "https://example.edu/issuers/keys/1",
      "jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5X
        sITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUc
        X16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtj
        PAYuNzVBAh4vGHSrQyHUdBBPM"
    }
  }],
  // Holder對本VP的簽名信息
  "proof": {
    "type": "RsaSignature2018",
    "created": "2018-09-14T21:19:10Z",
    "proofPurpose": "authentication",
    "verificationMethod": "did:example:ebfeb1f712ebc6f1c276e12ec21#keys-1",
    // challenge和domain是爲了防止重放攻擊而設計的
    "challenge": "1f44d55f-f161-4938-a659-f8026467f126",
    "domain": "4jt78h47fh47",
    "jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..kTCYt5
      XsITJX1CxPCT8yAV-TVIw5WEuts01mq-pQy7UJiN5mgREEMGlv50aqzpqh4Qq_PbChOMqs
      LfRoPsnsgxD-WUcX16dUOqV0G_zS245-kronKb78cPktb3rk-BuQy72IFLN25DYuNzVBAh
      4vGHSrQyHUGlcTwLtjPAnKb78"
  }
}

以上都是一些基本概念,尤其是DID、DID文檔、VC、VP等術語,掌握了這些基本概念後,我們下一篇文章以一個個實際的例子覆盤一次完整的DID使用過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章