10 个版本

0.2.2 2023 年 12 月 11 日
0.2.1 2023 年 12 月 10 日
0.1.9 2023 年 12 月 9 日
0.1.8 2023 年 6 月 13 日
0.1.2 2023 年 5 月 31 日

412密码学 中排名

Download history 1/week @ 2024-03-10 36/week @ 2024-03-24 4/week @ 2024-03-31

51 每月下载量

ISCLGPL-3.0+

265KB
6K SLoC

spaghettinuum

Spaghettinuum 是一种基于分布式哈希表的 DNS 替代品。用一盘意大利面取代网络。稍微去中心化,更加面条化。

特点

  • DNS 桥接
  • 智能卡/PCSC/GPG 卡身份,可选,作为购买新 Yubikey 5 Nano 的借口
  • 简单的 RESTy API

当前状态:已实现计划功能,但未彻底测试

这是什么

概念上 Spaghettinuum 是一个类似 DNS 的分布式两级键值存储

  • 级别 1:一个身份(类似于 DNS 名称,但基于您的公钥)
  • 级别 2:一个任意键(类似于 DNS 记录类型,但任意)
  • 值:一个字符串

您可以使用它来托管您的网站(至少是名称部分,几乎,下面有几个巨大的警告)和为尚未存在的各种服务提供公共服务发现。

此仓库

  • 一个 spagh 的参考实现,包括一个完全静态的以及基于数据库的配置,以及一个 HTTP 解析器和 DNS 桥接器,供仍在使用 DNS 的人使用
  • 一个用于与节点交互、管理身份、发布数据和生成基本配置的命令行工具 spagh-cli
  • 一个 Rust 库,用于在您的软件中嵌入解析器/发布者

安装

要获取服务器 spagh 和 CLI spagh-cli,请使用 cargo install spaghettinuum 安装。

如果您只是与服务器交互,只需 curl 即可。

在公共节点上尝试

有一个公共节点位于 spaghetinnuum.isandrew.com,IP 为 149.248.205.99,提供解析器和 DNS 桥接器。

解析器

解析器在端口 43891 上运行。

您可以使用CLI(cargo install spaghettinuum)查询任意密钥

spagh-cli query https://spaghetinnuum.isandrew.com:43891 yryyyyyyyyei1n3eqbew6ysyy6ocdzseit6j5a6kmwb7s8puxmpcwmingf67r dsf9oyfz83fatqpscp9yt8wkuw

或使用curl

curl https://spaghetinnuum.isandrew.com:43891/yryyyyyyyyei1n3eqbew6ysyy6ocdzseit6j5a6kmwb7s8puxmpcwmingf67r?key1,key2,...

DNS 桥接

Spaghettinuum支持DNS桥接,限于一组映射到DNS类型的密钥。DNS桥接运行在UDP端口53

尝试使用dig

dig @149.248.205.99 yryyyyyyyyei1n3eqbew6ysyy6ocdzseit6j5a6kmwb7s8puxmpcwmingf67r.s

如果您将DNS解析器设置为149.248.205.99,您可以在浏览器中阅读我的作品(WIP):https://yryyyyyyyyei1n3eqbew6ysyy6ocdzseit6j5a6kmwb7s8puxmpcwmingf67r.s/5987(WIP - 注意SSL问题与传统基础设施的工作,下面将讨论)。

查询

解析器API

要查询解析器,向RESOLVER/v1/IDENTITY?KEY1,KEY2,...发送HTTP GET请求。

响应格式如下

{
  "v1": {
    "key": {
      "expires": "RFC3339 datetime...",
      "data": "value"
    }
  }
}

如果无法解析身份,您将收到一个空的{"v1": {}}响应。

所有解析器都必须有此API。

CLI和环境变量

spagh-cli使用环境变量SPAGH_RESOLVER在未指定服务器时查找服务器。这应该是一个host:port对。

托管发布者或解析器

  1. 运行cargo install spaghettinuum
  2. 运行spagh-cli generate-config以生成配置
  3. 运行spagh --config YOURCONFIG.json以启动服务器

spagh服务器有一些子服务

  • 节点(DHT节点),必需
  • 解析器,提供查询的REST API,可选
  • 发布者,发布您的键值对,可选
  • DNS桥接,提供查询的DNS前端,可选

发布

设置身份

您需要身份才能发布。

有两种类型身份

  • 本地(您电脑上的文件)
  • 卡(PCSC/GPG智能卡)

要创建本地身份,请运行spagh-cli new-local-identity me.ident。它将在文件中保存身份和密钥,并打印出身份。任何拥有此文件的人都可以使用该身份进行发布,所以请小心处理。

要使用卡身份,用刚从挤出机中取出的Yubikey,

  1. 确保pcscd正在运行,并且您的Yubikey已插入
  2. 运行cargo install openpgp-card-tools,这将安装opgpcard
  3. 运行opgpcard list,应显示带有类似0006:123456789的ID的您的卡
  4. 通过以下命令安装新的私钥:opgpcard admin --card 0006:123456789 generate cv25519,使用默认的 12345678 管理员 PIN(目前仅支持 Ed25519,因此要获取它,必须使用 cv25519)。或者,您可以使用 Sequoia 或其他工具生成密钥,然后使用 opgpcard admin --card XYZ import 替代,如果您想备份您的身份。顺便说一下,Sequoia 非常酷,而且为之工作的人同样令人钦佩。
  5. 执行 spagh-cli list-card-identities 以确认其已被检测到并获取卡片 ID 的身份(用于发布)

卡片必须插入服务器,以便服务器可以签署发布内容。

批准身份

发布您的记录

要发布,您需要一个已启用发布服务的服务器。

创建一个名为 data.json 的 json 文件,其中包含您要在您的身份下发布的数据

{
  "missing_ttl": 60,
  "data": {
    "any key you want": {
      "ttl": 60,
      "data": "I love you"
    }
  }
}

TTL 是以分钟为单位。

missing_ttl 是在 data 中不存在的情况下,密钥可以假设为缺失的时间。

然后调用

spagh-cli publish --server http://localhost local ./identity.json ./data.json

以使用本地身份发布

spagh-cli publish --server http://localhost card 0006:12345678 - ./data.json

或使用卡片发布

发布 DNS

DNS 是正常发布的带有 DNS-bridge 特定密钥的数据,DNS bridge 服务理解特定值 JSON 格式。

您可以使用 spagh-cli generate-dns-data 生成用于与 spagh-cli publishspagh-cli publish-dns 一起使用的数据,或直接将记录发布到动态发布者。

如果需要修改数据,可识别的 DNS 密钥列表在 tree/master/src/data/standard.rs 中。

发布网站

这是关于将 spaghettinuum 集成到旧技术中,这样您就可以通过 spaghettinuum 使用普通浏览器访问您的网站。

请注意,spaghetinium 只处理名称解析 - 您仍然需要一个服务器来发布 HTTP 内容、API 等。

这里的难点主要是 SSL。有几个理论上可以在您的网站上解决 SSL 问题的方案

  1. DNSSEC TLSA 记录 - 您理论上可以将自签名证书存储在 DNS 中,一切都会很好。不幸的是,反进步的浏览器(Chrome 和 Firefox)都拒绝了支持 TLSA 记录的请求,因为谁想要未来。
  2. 新的 CA - 我希望建立一个,根据证书签名使用证书的身份来验证签名请求。这是一个稍微差一些的方法,因为每个人都需要将新的 CA 添加到他们的浏览器中(我想您可以将 CA 限制为某些域,但这仍然很危险且痛苦)
  3. SSL MITM 代理 - 我曾想过设置一个公共代理,但担心支付带宽费用
  4. 浏览器扩展(?)解析 .s 域并自行进行证书验证 - 我真的很想避免这样做,因为浏览器扩展越来越无能为力(例如:manifest v3),需要为 N 种类型的浏览器创建自定义扩展,需要处理敌对的发布审查/政策,需要与 JavaScript 一起工作,等等

TLDR:目前没有好的选择。

自托管

您需要

  • spaghettinuum 已安装
  • 为缓存和数据库保留少量磁盘空间
  • 用于DHT访问的UDP端口
  • 可选:如果启用,则用于解析和发布的HTTP端口(可能还有一个TLS反向代理)
  • 可选:如果启用发布,则用于发布者之间通信的HTTP端口(无TLS包装,它使用自己的TLS)

有关运行说明,请参阅spagh -h。有关配置模式和字段说明,请参阅server_config.schema.jsonspagh-cli会在您需要时为您生成默认配置。

架构

当您进行查找时,会发生以下情况

  1. 您向解析器发送请求
  2. 解析器查询DHT以找到权威发布者提供的地址。这就像DNS NS记录一样 - 它说明了谁有权为名称指定记录。
  3. 一旦解析器获取到发布者,它就会打开到发布者的TLS连接并请求密钥。
  4. 它将结果发送给您

DHT中包含的信息包括发布者的TLS证书的公钥 - 这在连接到发布者时会被验证。

DHT是经过修改的Kademlia,它使用公钥作为节点ID,并要求所有存储的值都使用用于密钥的身份进行签名。这种方法被其他去中心化协议(如IPFS和Ethereum)用于他们的DHT。

原因

为什么不是DNS

您有喜好无政府主义的倾向。

开玩笑的。不喜欢DNS的真正原因如下

  • 向寻租的中间商支付大量金钱
  • 不支付就会失去一切
  • 对人工有限资源的全球竞争
  • 差的DNS注册商安全/技术将域名名称投入深渊
  • 大公司可以接管小角色域名
  • IANA授予独裁者小领地

越来越多的东西依赖于DNS:获取SSL证书、电子邮件、Matrix、那个新的Twitter替代品。鉴于上述所有原因,我们越快有替代品越好。

无意义的名称

是的,google.com肯定比yryyyyyyyyei1n3eqbew6ysyy6ocdzseit6j5a6kmwb7s8puxmpcwmingf67r.s更容易记住。

但是我在日本,实际上人们已经生活在一个类似的世界里

  • 域名名称是无意义的 - 它们严重倾向于ASCII,这对许多日本人来说很难阅读。实际上,没有人直接使用域名名称 - 所有广告都说“搜索ABCD”,永远不会包含URL。浏览器默认搜索,因此您甚至不需要知道google.com
  • 每个人都在使用一个名为Line的通讯工具,它不使用任何绝对标识符(没有ID或电话号码) - 而是在您亲自遇到某人时,通过添加他们的QR码来与他们连接,或者通过添加他们到您通过其他人加入的群聊来添加他们。公司会在海报、广告等地方放置添加他们的QR码。

虽然我不认为谷歌公司的事情很好,但Line部分运作得很好,展示了信任网络模型如何在现实世界中工作。

在我的个人互联网使用中,我只使用几种类型的网站

  • 我经常访问并已将其添加到书签的网站:亚马逊、我的银行、Twitter等。书签只显示网站标题,我已经对其进行了审查并知道它们是安全的(除非DNS被破坏)。
  • 我在Google上搜索到的内容,这是一种低信任度的交互:技术信息、博客、评论等。在依赖这些信息之前,我会独立确认所有信息的真实性,通常来自多个来源。在这种情况下,我无论如何都不会查看域名。

随着越来越多的域名被使用,无意义的后缀数量不断增多,域名提供的信任度持续下降。那个新银行是位于futurebank.io还是futurebank.cashfuturebank.xyzfuturebank.it(等等)。那么域名抢注怎么办?创意名称,如lyftlift呢?

因此,今天安全地浏览网页需要

  1. 通过可信渠道建立对新网站的信任:朋友链接到网站,你正在与之进行业务的公司提供带有他们官方网站的小册子
  2. 将其他所有网站视为不可信:不输入信用卡信息,提供你的电子邮件地址等

所有这些都会与无意义名称相同。

基于文本的API

我的想法是

  • 能够使用curl和/或javascript创建请求非常重要,这对于采用率很重要
  • 性能不是关键:DNS不在任何热点路径上,DNS结果可以缓存并且变化不频繁,因此性能不是那么关键
  • 以UTF-8编码二进制并不难。Base64广泛可用

二进制API可能在将来可用。

依赖关系

~61–84MB
~1.5M SLoC