10 个版本
0.2.2 | 2023 年 12 月 11 日 |
---|---|
0.2.1 | 2023 年 12 月 10 日 |
0.1.9 |
|
0.1.8 | 2023 年 6 月 13 日 |
0.1.2 | 2023 年 5 月 31 日 |
412 在 密码学 中排名
51 每月下载量
265KB
6K SLoC
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
对。
托管发布者或解析器
- 运行
cargo install spaghettinuum
- 运行
spagh-cli generate-config
以生成配置 - 运行
spagh --config YOURCONFIG.json
以启动服务器
spagh
服务器有一些子服务
- 节点(DHT节点),必需
- 解析器,提供查询的REST API,可选
- 发布者,发布您的键值对,可选
- DNS桥接,提供查询的DNS前端,可选
发布
设置身份
您需要身份才能发布。
有两种类型身份
- 本地(您电脑上的文件)
- 卡(PCSC/GPG智能卡)
要创建本地身份,请运行spagh-cli new-local-identity me.ident
。它将在文件中保存身份和密钥,并打印出身份。任何拥有此文件的人都可以使用该身份进行发布,所以请小心处理。
要使用卡身份,用刚从挤出机中取出的Yubikey,
- 确保
pcscd
正在运行,并且您的Yubikey已插入 - 运行
cargo install openpgp-card-tools
,这将安装opgpcard
- 运行
opgpcard list
,应显示带有类似0006:123456789
的ID的您的卡 - 通过以下命令安装新的私钥:
opgpcard admin --card 0006:123456789 generate cv25519
,使用默认的12345678
管理员 PIN(目前仅支持 Ed25519,因此要获取它,必须使用cv25519
)。或者,您可以使用 Sequoia 或其他工具生成密钥,然后使用opgpcard admin --card XYZ import
替代,如果您想备份您的身份。顺便说一下,Sequoia 非常酷,而且为之工作的人同样令人钦佩。 - 执行
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 publish
或 spagh-cli publish-dns
一起使用的数据,或直接将记录发布到动态发布者。
如果需要修改数据,可识别的 DNS 密钥列表在 tree/master/src/data/standard.rs 中。
发布网站
这是关于将 spaghettinuum 集成到旧技术中,这样您就可以通过 spaghettinuum 使用普通浏览器访问您的网站。
请注意,spaghetinium 只处理名称解析 - 您仍然需要一个服务器来发布 HTTP 内容、API 等。
这里的难点主要是 SSL。有几个理论上可以在您的网站上解决 SSL 问题的方案
- DNSSEC TLSA 记录 - 您理论上可以将自签名证书存储在 DNS 中,一切都会很好。不幸的是,反进步的浏览器(Chrome 和 Firefox)都拒绝了支持 TLSA 记录的请求,因为谁想要未来。
- 新的 CA - 我希望建立一个,根据证书签名使用证书的身份来验证签名请求。这是一个稍微差一些的方法,因为每个人都需要将新的 CA 添加到他们的浏览器中(我想您可以将 CA 限制为某些域,但这仍然很危险且痛苦)
- SSL MITM 代理 - 我曾想过设置一个公共代理,但担心支付带宽费用
- 浏览器扩展(?)解析
.s
域并自行进行证书验证 - 我真的很想避免这样做,因为浏览器扩展越来越无能为力(例如:manifest v3),需要为 N 种类型的浏览器创建自定义扩展,需要处理敌对的发布审查/政策,需要与 JavaScript 一起工作,等等
TLDR:目前没有好的选择。
自托管
您需要
spaghettinuum
已安装- 为缓存和数据库保留少量磁盘空间
- 用于DHT访问的UDP端口
- 可选:如果启用,则用于解析和发布的HTTP端口(可能还有一个TLS反向代理)
- 可选:如果启用发布,则用于发布者之间通信的HTTP端口(无TLS包装,它使用自己的TLS)
有关运行说明,请参阅spagh -h
。有关配置模式和字段说明,请参阅server_config.schema.json。spagh-cli
会在您需要时为您生成默认配置。
架构
当您进行查找时,会发生以下情况
- 您向解析器发送请求
- 解析器查询DHT以找到权威发布者提供的地址。这就像DNS NS记录一样 - 它说明了谁有权为名称指定记录。
- 一旦解析器获取到发布者,它就会打开到发布者的TLS连接并请求密钥。
- 它将结果发送给您
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.cash
或futurebank.xyz
或futurebank.it
(等等)。那么域名抢注怎么办?创意名称,如lyft
与lift
呢?
因此,今天安全地浏览网页需要
- 通过可信渠道建立对新网站的信任:朋友链接到网站,你正在与之进行业务的公司提供带有他们官方网站的小册子
- 将其他所有网站视为不可信:不输入信用卡信息,提供你的电子邮件地址等
所有这些都会与无意义名称相同。
基于文本的API
我的想法是
- 能够使用curl和/或javascript创建请求非常重要,这对于采用率很重要
- 性能不是关键:DNS不在任何热点路径上,DNS结果可以缓存并且变化不频繁,因此性能不是那么关键
- 以UTF-8编码二进制并不难。Base64广泛可用
二进制API可能在将来可用。
依赖关系
~61–84MB
~1.5M SLoC