关于这一服务在中文世界似乎还没有绍介,倒是在 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
orhttps://keyoxide.org/EMAIL
注解:
- 上述格式都是对于 pgp 密钥而言,其中
FINGERPRINT
就是你的公钥指纹(小写?)(关于 pgp 的知识请参见各种科普),而FINGERPRINT_URI
就是openpgp4fpr:FINGERPRINT
Hashed UR
就是对 URI 的argon2
或bcrypt
哈希- Message 中其他内容无关紧要,重要的就是含有
FINGERPRINT_URI
Profile URL
是特定Keyoxide
实例提供的 profile 页面链接,也可以进行重定向。
OpenPGP 下的使用#
首先,你需要一个 OpenPGP 的密钥,这一步不是本文要讲述的,参见其他指南。
接下来,你需要:
gpg --edit-key FINGERPRINT
uid N
notation
然后在`notation`里一行放置一个`[email protected]=CLAIM`,放置一些`Claim`。
save
然后将公钥上传到 keys.openpgp.org
或 Web 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 和存储。