#public-key #ipfs #pki #crypto

world_id

创建分布式PKI的一个实验

1个不稳定版本

使用旧的Rust 2015

0.1.0 2018年4月3日

#25 in #pki

Apache-2.0 OR MIT

24KB
324

WorldID

一个用于分布式PKI的实验性项目。目标是类似于OpenID,想法类似于GPG,但希望创造出一个a)远更简单、更容易使用,b)使其他程序的身份验证变得简单(可以非常容易地由库、网页等使用)的产品。

基本想法是将公钥放在DHT中——目前使用IPFS。然后,用户可以通过从DHT中获取对象来获取其他公钥、验证它们等。公钥的唯一标识符是它的DHT哈希。用户可以通过在DHT中插入一条新记录并使用私钥签名来发布其数据的更新。

PGP/GPG专注于电子邮件。而且做得并不好。我们生活在一个想要在网页浏览器和网页服务器上对特定的API请求(如,登录)进行签名和验证的世界。

优点

任何人都可以检索任何公钥,验证它等;不需要任何集中式权威机构。

标识符只是一个唯一的哈希值

你可以拥有任意数量的密钥,它们可能或可能不相互链接

缺点

旧密钥不能指向新密钥并说“你想要查看这个”

旧密钥可能会被网络遗忘,从而打破信任链

如果你丢失了私钥,你就完了(当然)

你可以通过发布新记录来对某人的密钥进行签名,但你不能从一个密钥开始并看到谁签了它,除非他们更新了记录来宣传这些签名——然后你有了一个新的密钥。

讨论

基本上,这些都是内容地址的merkle-DAG-like结构(如IPFS)的问题。内容地址是很好的,直到内容发生变化,人们必须被告知这一点。因此,我们需要一个人类名称到内容ID的映射。据我所知,目前还没有这样的分布式系统;我们最接近的是DNS,它由中央当局以略微合理的方式管理。

一种可能的解决方案可能类似于IPLD,它基本上使用DNS TXT或SRV记录来提供人类名称到内容ID的映射。这可能不适合快速更新的内容,如交互式网页、论坛、聊天等,但对于像这样的内容,个人可能不会每隔几秒就更新他们的密钥,也不需要实时更新。

传输

它使用IPFS并需要本地运行IPFS节点;它通过其本地HTTP API与节点通信。

坦白说,我喜欢IPFS所做的事情,但不喜欢它是如何做的。这似乎是在重新发明世界,我不太相信这是必要的。守护程序也非常庞大,并且速度可能非常慢,没有特别好的工具。它需要每个机器都运行一个专用的服务器进程,那个服务器资源消耗很大,管理它也很麻烦。它离即插即用解决方案还远着呢。:-/

那有什么替代方案?

  • Bittorrent -- 通常需要一个跟踪器,尽管DHT模式可能会使其工作。磁力链接并不特别方便。说实话,这可能是最合适的方法。
  • DAT -- 并非设计成通用块存储的“云”,而是一种在已知机器之间同步有限数据的高效方法
  • ???
  • 让IPFS变得更好 -- 我尝试过,但进入这个庞大且文档不佳的代码库非常困难。
  • 自己实现DHT -- 也许有一天。

数据格式

目前它使用CBOR,但其细节尚未明确定义。它们需要在某个时候被定义,以便其他程序/实现可以互操作,但到目前为止,这是一个实验。

CBOR并不完美,但可能是最好的选择。我们不能使用JSON或XML等,因为键是通过它们的哈希值来标识的,所以空白字符很重要。Protobuf可能可以,capnp可能更好,但CBOR简单且没有我知道的实际问题,所以到目前为止还可以。这是我喜欢过度梳理的野兔,所以欢迎建议!可能的替代方案有:bincodemsgpack,也许还有bencode

数据字段

  • 标识符(用户名)
  • 公钥
  • 创建时间戳(UTC)
  • 过期时间戳(可选)

公钥算法:Ed25519

哦,能够确保这些标识块具有严格的上限大小将会很有用,这样就可以轻松地对其进行分析。

状态

完成

  • 创建身份,创建公钥和私钥,以及它们的序列化和反序列化
  • 将身份添加到IPFS,并再次检索它们
  • 使用私钥签名消息,并使用从IPFS检索的ID进行验证。
  • 发布新的id,替换旧的id,并使用旧私钥签名

待办事项

  • 检查过期和创建日期的有效性。
  • 使用链接到先前旧ID的ID进行签名,并验证签名是否有效
  • 以某种方式使用自己的私钥签名他人的证书。
  • 加密/解密?ring似乎不做这个... :/

依赖关系

~26MB
~575K SLoC