banner
Wind_Mask

Wind_Mask

Wind_Mask,technically me.
github
email

Keyoxide介紹

關於這一服務在中文世界似乎還沒有紹介,倒是在 github 和一些 Fediverse 上能見到用戶使用。
類似的 keybase 服務我之前嘗試時由於它不支持 pgp 子密鑰還是什麼 pgp 的功能所以沒有使用,另一方面 Keyoxide 的設計的確更加去中心和自主。
姑且對此做了一些工作(包括中文翻譯和用另一種語言對其協議的實現),因此現在來介紹一下。

準確細節,文檔,代碼參見官方網站Keyoxide

簡介#

如官方言:

Keyoxide is a privacy-friendly tool to create and verify decentralized online identities.
Just like passports for real life identities, Keyoxide can be used to verify the online identity of people to make sure one is interacting with whom they are supposed to be and not imposters.
Unlike real life passports, Keyoxide works with online identities or "personas", meaning these identities can be anonymous and one can have multiple separate personas to protect their privacy, both online and in real life.

我解釋之為:Keyoxide是實現這樣一種目的,即聯繫一個身份各種渠道的一致性:以密碼學和去中心的托管以及允許代理或自行驗證來保證一個身份在多個渠道的一致性。
它不是也不能證明你是你,而是證明多個渠道(或其控制人)可由同一個密鑰的掌控者控制。簡而言之,也就是說,證明 A 平台上某賬號和 B 平台某賬號是同一個人(渠道有更多含義如一個域名)。

規範#

就身份的配置構成上,Keyoxide使用Ariadne Spec,以解釋在線身份的構成格式。

在深究原鏈接後面的規範前,你也可以先聽信我的簡單解釋:一個在線身份就是一個用密鑰簽名(相關知識可參見任何講述非對稱密碼學的科普)了的身份文檔,文檔由一些:

  • 元數據,表明使用的密碼學信息,以及這是一個在線身份文檔
  • Claims, 宣稱,即對一些在線渠道,賬戶的身份的宣稱,例如宣稱一個域名屬於此身份或一個 github 賬戶屬於此身份。
  • 用戶願意記錄的個人信息如郵箱簡介頭像鏈接等

然後文檔被簽名並分發。
那麼怎麼驗證這些渠道確實屬於此身份呢?
對於各種不同的服務商和渠道,有不同的 api 或方式可公開獲取所有者才能控制的信息,例如對域名以 dns 中 txt 的記錄,對於 github 則是賬戶的公開 gist。在這些信息中所有者記錄特定的 proof:

An identity proof may be:

  • an URI representation of a cryptographic key's identifier
  • a cryptographic hash of a URI representation of a cryptographic key's identifier
  • an URL pointing to a web representation of an Ariadne Identity Profile

換而言之就是所有者在賬戶中記錄了用於簽名 profile 文檔的 uri(類似與密鑰的指紋)或這個 uri 的哈希或指向 profile 文檔的鏈接。
這樣,得到簽名 profile 文檔的人可以獲取其中各 claim 的賬戶是否有按規範放置的 proof, 如果得到即證明對應渠道確實屬於此身份控制。

格式#

Claim的格式為[email protected]=CLAIM,其中CLAIM內容請參照各Available claims/proofs中的要求。
proof(這是指放在你的各個賬號里的,Claim里的proof@...就是字面)的格式則有幾種:

  • URI:openpgp4fpr:3637202523e7c1309ab79e99ef2dc5827b445f4b(對後文ASP則是aspe:domain.tld:ASPFINGERPRINT
  • Hashed URI:$argon2id$v=19$m=16,t=2,p=1$UElOT0ZIU09mSHlReE1lcg$2nJmgFL0s3DHPksuSE2enw
  • Message:[Verifying my cryptographic key: FINGERPRINT_URI]
  • Profile URL:https://keyoxide.org/FINGERPRINT or https://keyoxide.org/EMAIL

註解:

  • 上述格式都是對 pgp 密鑰而言,其中FINGERPRINT就是你的公鑰指紋(小寫?)(關於 pgp 的知識請參見各種科普),而FINGERPRINT_URI就是openpgp4fpr:FINGERPRINT
  • Hashed UR就是對 URI 的argon2bcrypt哈希
  • Message 中其他內容無關緊要,重要的就是含有FINGERPRINT_URI
  • Profile URL是特定Keyoxide實例提供的 profile 頁面鏈接,也可以進行重定向。

OpenPGP 下的使用#

首先,你需要一個 OpenPGP 的密鑰,這一步不是本文要講述的,參見其他指南。
接下來,你需要:

gpg --edit-key FINGERPRINT
uid N
notation
然後在`notation`里一行放置一個`[email protected]=CLAIM`,放置一些`Claim`
save

然後將公鑰上傳到 keys.openpgp.orgWeb Key Directory
請記得按Available claims/proofs中的要求更新你的各個渠道的信息,否則驗證的結果就是失敗了。
然後在Keyoxide就可以搜索密鑰 id 指紋或郵箱以獲取你的 profile 文檔了。

Ariadne Signature Profile#

除了 OpenPGP 外,也單獨提供了一種規範用於給出簽名profile文檔,我以為在 PGP 公鑰里註釋並非最好選擇,但是新的格式亦有推廣之難,讀者自行考量。
這種方法採用JSON Web Signature (JWS)來簽名身份文檔,從而有了更廣泛實現而不依賴於特定的 OpenPGP 實現;支持更先進的密碼學原語。
按規範ASP只採用:

  • algorithm: "EdDSA", curve: "Ed25519" (RFC8037)
  • algorithm: "ES256", curve: "P-256"
    這兩種JWS的簽名算法和曲線的組合。
    並且使用在JWS中包含JWK格式的公鑰。
    從而使用所謂Profile JWS, 必須以RFC7515第 3.1 節中定義的緊湊序列化 (Compact Serialization) 進行序列化。

Profile jWS header中:
typ=JWT
alg= 簽名算法,見IANA-JOSE
jwk=JWK格式的公鑰(即一種表示公鑰的 json)
kid= 公鑰的按本規範特定的指紋,見下文

Profile JWS payload中則帶上 name,claims,description 等負載作為內容(具體格式參見Ariadne Signature Profile v0

ASP fingerprint#

ASP的指紋按RFC7638中計算JWK指紋的方法取SHA512作為哈希算法得到 RFC 規範中的指紋後,取其前 16 個字節作無填充的BASE32得到ASP的指紋。
指紋應大小寫皆可,代碼中以轉為大寫為準。

ASPE 服務器與客戶端#

有了ASP後只要能公開獲取它就可以按與 OpenPGP 中身份文檔同樣的方法驗證了。
規範定義了Ariadne Signature Profile Exchange Protocol,從而假定一種可以通過 api 進行交互的服務端可用於上傳,保存公開獲取ASP
按照此交換協議客戶端與服務端交互並上傳更新或刪除ASP

驗證#

假定你成功上傳了一份ASP,其指紋為ASPFINGERPRINT,所在的 ASPE 服務端域名為domain.tld。,則這份ASP將有一個ASPE URI表示為aspe:domain.tldASPFINGERPRINT
此時在Keyoxide上輸入這個ASPE URI即可驗證其。

ASP 使用方法#

那麼問題就來了,怎麼構造ASP,又怎麼把它上傳到服務端?
首先,keyoxide.org這個域名就是一個ASPE服務端,也就是說只要你按協議就可以與之交互。
一是在asp.keyoxide提供了一個在線 web 界面可以用於生成ASP並上傳到指定域名的服務端,不過其支持的 claim 渠道有限(至少幾個月前我看是),無法完全自定義。
二是kx-aspe-cli,不過也只支持很有限的設計。
如果你想在本地自定義ASP(但是當然要按服務商渠道自己給出 claim 以及編輯配置文件)甚至自己生成密鑰的話,我之前寫了一個命令行工具以達到目的:aspe-client-go,我本人使用已確定現在與keyoxide.org可交互(當然也包括我後文將提到的我自己寫的服務端)。

推銷#

如果你有意推廣這一工具和協議的使用,可參加其服務端的托管,包括:

  • Keyoxy的實例,即可以驗證身份配置文檔的服務
  • ASPE服務端,可以存儲和公開提供ASP
    前者的指南參見Self-hosting Keyoxide
    後者有aspe-server-rs,但似乎還沒集成數據存儲,我寫了一個實現aspe-server-go, 應該已經實現了 api 和存儲。
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。