12 个版本
使用旧 Rust 2015
0.2.10 | 2020年2月17日 |
---|---|
0.2.9 | 2020年2月14日 |
0.2.2 | 2020年1月24日 |
0.1.2 | 2018年6月24日 |
0.1.1 | 2018年4月2日 |
#1721 在 网络编程
每月 30 次下载
430KB
10K SLoC
KIPA: 密钥到IP地址
一个分布式密钥到IP地址查询网络。
什么是 KIPA?
KIPA 是一个查找服务,用于找出哪些 IP 地址属于一个公钥。KIPA 网络上的每个人都可以通过他们的密钥进行查找,并帮助在网络中查找其他人。
它是 分布式的,这意味着网络不依赖于单个服务器(由 基准测试 支持)。
它是 零信任 的,这意味着它能够抵御 恶意行为者。
它是 可扩展的,在大型网络规模(由 基准测试 支持)和慢速网络速度(由 基准测试 支持)下表现良好。
KIPA 仍在开发中,应谨慎使用。建议您生成一个新的密钥来尝试 KIPA。
它是如何工作的?
当一个节点加入 KIPA 网络,它的公钥被映射到一个 n 维空间,其中 n 在整个网络中是常数。映射是均匀和确定性的。这个空间被称为 密钥空间。(关于 n 的值的讨论,请参阅 选择维度)。
每个节点将尝试找到在密钥空间中接近它的其他节点的 IP 地址,并将这些节点设置为它的 邻居。一旦实现这一点,就可以使用简单的图搜索算法进行查找:一个节点可以将选定的公钥映射到密钥空间,然后识别与该点最近的邻居,并请求该邻居对该点最近的邻居。这个过程会一直继续,直到找到正确的节点(或者确定不存在这样的节点)。这是一个略微修改的 贪婪最佳优先搜索 算法,其中度量标准是密钥空间中的距离。
节点通过初始节点连接到网络 - 该节点可以是网络中的任何节点,但在连接之前必须知道其IP地址和公钥。为了找到其邻居,连接节点会在网络中对自己进行搜索(类似于上面的方式),并选择遇到的最近节点。
您可以在这里找到KIPA设计的更详细概述,以及未来计划工作的摘要这里。
为什么它存在?
KIPA是用于分布式系统的工具。在DNS不适用的情况下可以替代DNS - 例如,当
- 节点的IP地址经常变化。
- 节点太多,无法在DNS注册机构注册。
- 部署具有社区节点的分布式系统,其中社区注册困难。
- DNS无法保证足够高的安全性。
它也可以用于日常情况,例如在不知道IP地址但知道公钥的情况下在计算机之间发送文件。
# Run on receiver
nc -l -p 8080 > file.txt
# Run on sender
cat file.txt > nc $(kipa search --key $RECEIVER_KEY_ID --print ip) 8080
使用KIPA需要系统中已经知道密钥 - 它不能解决密钥分发问题。它所做的是提供一种安全和分布式的架构来解析最新的IP地址。
为什么是分布式的?
分布式系统相对于集中式系统具有几个优势。在KIPA的情况下,其分布式架构产生了一些具体优势
- 隐私:由于消息在网络上均匀分布,没有单个节点能看到所有消息。因此,除非所有节点都由一个组织控制,否则无法实现全面的信息控制。
- 鲁棒性:没有单个节点可以失败并破坏整个网络。
- 社区控制:网络的控制权不授予一个组织,这意味着网络的性能和稳定性取决于社区。如果社区使用KIPA,KIPA就会保持在线。否则,如果没有人在使用,KIPA就会下线。
* 这种设计的效果是每个节点都知道网络中一部分的查找。然而,随着网络中节点数量的增加,这一部分会变得越来越小。因此,任何单个节点都不会看到大量信息。
用法
先决条件
- Rust和Cargo >= 1.26.0
- Protobuf编译器 >= 3.5.1
- GnuPG >= 2.2.8
gpgme
包需要autogen
,gettext
来构建
# KIPA is a work in progress - to be cautious, make a KIPA-specific key when trying it out.
gpg --generate-key
# KIPA reads the key password from a file.
echo "my-secret-key-p@ssword" > secret.txt
# Install KIPA.
cargo install kipa
# Start the daemon, and connect to any node in the network. A live example is given.
kipa-daemon --key "$MY_KEY_ID" \
--connect-key D959094C \
--connect-address 46.101.16.228:10842 &
# This will listen on port 10842 (overridable with --port) to communicate with other KIPA nodes - so
# if you're behind NAT, be sure to expose the port!
# Now you can search for key IDs that you have in GPG!
kipa search "$THEIR_KEY_ID"
Docker
您还可以在Docker容器中设置守护进程。
# Set up a new key, export it to a file, and export the password to a file.
gpg --generate-key
gpg --export-secret-keys --output "$KEY_PATH" "$KEY_ID"
echo "my-secret-key-p@ssword" > $KEY_PASSWORD_PATH
# Start the container, and connect to any node in the network. A live example is given.
docker run \
--name kipa \
# Mount the secret key files.
--mount type=bind,source=$KEY_PATH,target=/root/key \
--mount type=bind,source=$KEY_PASSWORD_PATH,target=/root/key-password \
# If running as a production instance, set up restarts, detach, and expose the port.
--restart on-failure --publish 10842:10842 --detach \
mishajw/kipa:latest
--key "$KEY_ID"
--connect-key D959094C
--connect-address 46.101.16.228:10842
# You can use `docker exec` to run KIPA commands.
# Note that only the keys in `./resources/keys` are in the container's GPG.
docker exec kipa \
kipa search "$THEIR_KEY_ID"
模拟
KIPA网络模拟代码位于./simulation
。这还包括端到端测试和基准测试。模拟结果写入./simulation_output
。
基准测试文档讨论了如何使用模拟来评估KIPA的性能。
模拟创建了一个Docker容器网络。所有创建的资源都以kipa_simulation_
为前缀,并在模拟完成后删除。
先决条件
- 所有先前提到的先决条件
- Python和Pip >= 3.6
virtualenv
>= 15.1.0- Docker >= 18.05.0,守护进程正在运行
# Install dependencies in virtualenv
python -m venv .env && source .env/bin/activate
pip install -r simulation/requirements.txt
# Run end-to-end tests
python -m unittest discover simulation
# Run simulation configuration
# Example network configurations exist in `./resources/simulaton_configs/`
python -m simulation --network_config $NETWORK_CONFIGURATION_FILE
依赖项
~19–33MB
~502K SLoC