#ip-address #public-key #networking #distributed #node #dns #secret-key

bin+lib kipa

分布式密钥到IP地址(KIPA)查询网络

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 次下载

GPL-3.0 许可证

430KB
10K SLoC

Rust 8K SLoC // 0.1% comments Python 1.5K SLoC // 0.1% comments Shell 42 SLoC // 0.2% comments

KIPA: 密钥到IP地址

Crates.io Build Status Documentation

一个分布式密钥到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包需要autogengettext来构建
# 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