Peergos/Peergos
GitHub: Peergos/Peergos
一个点对点加密的全球文件系统,提供安全文件存储、分享、消息和社交网络功能,用户完全掌控自己的数据。
Stars: 2408 | Forks: 190
/statusIcon)

# Peergos
Peergos 正在构建下一代网络——私密网络,在那里终端用户掌控一切。想象一下,Web 应用默认安全且无法追踪你。想象一下,你能够精确控制每个 Web 应用可以查看哪些个人数据。想象一下,你再也不用登录任何应用了。你拥有自己的数据,并决定数据存储在哪里、由谁查看。在 Peergos,我们相信隐私是一项基本人权,我们希望让每个人都能以尊重这一权利的方式轻松地进行在线互动。
Peergos 的基础是一个点对点加密的全球文件系统,具有细粒度的访问控制,设计用于抵御数据内容或社交关系图的监控。它有一个安全的消息应用、一个加密的邮件客户端和桥接器,以及一个完全私密且安全的社交网络,用户掌控谁能看到什么(通过加密执行)。Peergos 的座右铭是:"掌控你的数据,掌控你的命运。"
Peergos 这个名字来自希腊语 Πύργος(Pyrgos),意思是堡垒或塔,但按音韵拼写,与点对点的含义很好地联系起来。发音:peer-goss(如 gossip 中的 goss)。
## 截图

更多截图请查看 web-ui 仓库 [https://github.com/Peergos/web-ui](https://github.com/Peergos/web-ui)。
## 技术手册
您可以在我们的[技术手册](https://book.peergos.org)中详细了解我们的特性和架构。
## 最新进展
要了解最新开发动态,请阅读最新的[发布说明](https://peergos.net/public/peergos/releases)或查看我们的 [web-ui 仓库版本](https://github.com/Peergos/web-ui/releases)。
## 媒体资料
介绍 Peergos 的演讲幻灯片在[这里](https://speakerdeck.com/ianopolous/peergos-architecture)
IPFS Camp 2024 深度解析
[](https://www.youtube.com/watch?v=yDU4GHsEo34)
Devstaff Crete 深度解析:
[](https://www.youtube.com/watch?v=Po_fdZYcfXo)
IPFS Thing 概览:
[](https://www.youtube.com/watch?v=g1vzoZjG9Zo)
[](https://www.youtube.com/watch?v=HVyrVUI2-RA)
Peergos 上的应用:
[](https://www.youtube.com/watch?v=3i1TtknNw2E)
[](https://www.youtube.com/watch?v=mSElk2jcFqY)
应用深度解析:
[](https://www.youtube.com/watch?v=oberD75GU8I)
IPFS Lab Day 架构演讲:
[](https://www.youtube.com/watch?v=h54pShffxvI)
介绍和 2020 年更新:
[](https://www.youtube.com/watch?v=oXMqYDLKWPc)
介绍:
[](https://www.youtube.com/watch?v=dCLboQDlzds)
## 审计
### 2024
https://peergos.org/posts/security-audit-2024
### 2019
https://peergos.org/posts/security-audit
### 所有审计报告
https://github.com/Peergos/Peergos/tree/master/audits
## 聊天室
Peergos 在 [Matrix](https://matrix.to/#/#peergos-chat:matrix.org) 上有一个公共聊天室。
## Peergos 的目标
- 允许个人在点对点网络中安全且私密地存储文件,该网络没有中心节点,通常难以中断或监控
- 允许与其他网络用户安全共享文件,且没有可见的元数据(谁与谁分享)
- 允许直接从 Peergos 加载和运行 Web 应用,在沙箱中防止数据泄露,并基于用户授予的权限
- 拥有美观的用户界面,任何电脑或移动用户都能理解
- 独立于中心化 TLS 证书颁发机构信任架构
- 可自托管——用户应该能够轻松地在自家机器上运行 Peergos,并从中获得自己的 Peergos 存储空间和社交通信平台
- 拥有安全的 Web 界面
## 项目反目标
- Peergos 尚未提供匿名性。匿名性可以通过仅通过 Tor 创建和访问用户账户来实现
## 架构
1.0 架构层次
- 1:点对点和数据层 - [IPFS](https://ipfs.io) 提供数据存储、路由和检索。用户必须至少有一个 Peergos 实例存储其数据才能使其可用。
- 2:授权层 - 密钥对控制谁能够修改文件系统的一部分(每次写入都有签名)
- 3:数据存储 - 由给定公钥控制,有一个 [merkle-champ](https://en.wikipedia.org/wiki/Hash_array_mapped_trie) 包含随机标签下的加密块,没有任何交叉链接对服务器可见(服务器无法推断文件大小)
- 4:加密 - 在用户机器上使用 [TweetNaCl](http://tweetnacl.cr.yp.to/) 进行强加密,文件的每个 5MiB 块独立加密。
- 5:社交层实现关注或与另一用户成为朋友的概念,而不向任何人暴露社交网络。
- 6:分享 - 与朋友进行安全的加密文件分享。
2.0 编程语言
- IPFS 层使用 Java 编写 - 我们有一个最小的 ipfs 实现 - [Nabu](https://github.com/peergos/nabu)
- Peergos 服务器使用 Java 编写以在 JVM 上运行,以获得可移植性和速度,主要使用 Java
- Web 界面主要使用 Java 编写并交叉编译为 JavaScript,Tweetnacl 和 scrypt 库除外,以及少量用于 Vue.js 的 JS GUI 代码
- 应用使用 HTML5 编写
3.0 节点
- 有一个 pki 节点确保用户名唯一,使用类似于证书透明度的结构。此数据在每个 peergos 服务器上镜像。
- 新节点联系任何公共 Peergos 服务器以加入网络
4.0 信任
- 新版本的软件将通过 Peergos 本身分发。(如需要,用户可以关闭此功能)
- 信任公共 Peergos 服务器(以及 SSL 证书颁发机构链)的用户可以通过 TLS 使用 Web 界面
- 较不信任的用户可以在自己的机器上运行 Peergos 服务器/代理,并通过 localhost 使用 Web 界面
- 更谨慎的用户可以在自己的机器上运行 Peergos 服务器,并使用 CLI 或 fuse/webdav 绑定
- 服务器是无信任的——即使您的服务器被泄露,您的数据和元数据也无法被暴露(假设您的客户端未被泄露)
- IPFS 本身不受信任,从中存储或检索的所有数据都是自认证的
- 数据存储(可能不是直接使用 IPFS,而是例如 S3 兼容服务)也不受信任
4.0 登录
- 用户的用户名与随机盐和密码哈希一起通过 scrypt(参数为 17、8、1、96,尽管用户可以选择更难的参数)运行,以生成对称密钥和签名密钥对。然后使用签名密钥对进行身份验证并检索加密的登录数据。然后使用对称密钥解密此登录数据,以获取身份密钥对、社交密钥对和根目录能力。这意味着用户可以从任何机器登录而无需传输任何密钥,并且他们的密钥受到暴力攻击保护(请参阅上面提到的幻灯片以获取成本估算)。
5.0 加密
- 私钥永远不会离开客户端节点。为每个文件或目录生成两个随机对称密钥(明确不是收敛加密,后者会泄露信息)
5.1 后量子加密
- 尚未与另一用户共享的文件已经能够抵抗基于量子计算机的攻击。这是因为从登录到查看明文的操作只包括哈希和对称加密,据目前认为这两者都不会因量子计算机而显著削弱。
- 用户之间共享的文件目前容易受到足够大的量子计算机攻击,如果攻击者能够记录用户之间发送的初始关注请求(在用户检索并删除之前)。一旦出现明确的后量子非对称算法候选,我们将立即替换它。
7.0 社交网络
- 任何人都可以向任何人发送"关注请求"。这相当于"关注"某人,而且是单向协议。这存储在目标用户的服务器上,但服务器无法看到是谁发送了好友请求(它是加密盲化的)。
- 目标用户可以用自己的好友请求回复好友请求,使其成为双向的(通常的朋友概念- 一旦集成了洋葱路由,攻击者(或我们)将无法推断社交关系图(谁与谁是朋友)。
7.0 分享文件(与另一用户、通过秘密链接或公开分享)
- 一旦用户 A 被用户 B 关注,A 就可以与 B 分享文件(B 可以随时撤销其关注)
- 文件访问控制基于 Wuala 使用的 [cryptree](https://raw.githubusercontent.com/ianopolous/Peergos/master/papers/wuala-cryptree.pdf) 系统
- 可以生成指向文件或文件夹的链接,可以通过任何媒介与任何人分享。链接形式为 https://demo.peergos.net/#KEY_MATERIAL,其特点是即使链接也不会向网络泄露文件内容,因为 # 后的密钥材料不会发送到服务器,而是在浏览器本地解释。我们扩展了 cryptree 以保护更多元数据,包括文件大小、名称、缩略图、目录结构等。
- 用户可以发布对其控制的文件或文件夹的能力,使其公开可见
## 使用方法 - 本地运行以登录到另一个实例
使用此方法登录到另一个实例上的 Peergos 账户,不依赖 DNS 或 TLS 证书颁发机构。
1. 从 https://peergos.net/public/peergos/releases 下载发布版本
2. 如果下载的是 jar 包,安装 Java - 需要安装 Java >= 25。
3. 运行 Peergos:
```
java -jar Peergos.jar daemon
```
或对于原生包:
```
peergos daemon
```
所有 Peergos 数据默认存储在 ~/.peergos 中,可通过环境变量或参数 -PEERGOS_PATH 覆盖。
然后您可以通过 http://localhost:8000 访问 Web 界面并登录。
在这种操作模式下,您的所有写入都直接代理到您的家庭服务器。本地实例会缓存您访问的任何块以加快后续访问。
如果您使用的是打包的桌面应用,或 macOS 上的默认 `peergos` 启动器,您可以使用以下命令指向自托管实例:
```
peergos -server-url https://YOUR_PEERGOS_SERVER_DOMAIN
```
要使桌面应用持久化,请将以下内容添加到 `~/.peergos/config`:
```
server-url = https://YOUR_PEERGOS_SERVER_DOMAIN
```
出于安全考虑,远程服务器首选 `https`,仅对环回地址(如 `http://localhost:8000`)使用纯 `http`。
## 使用方法 - 自托管
使用此方法运行新的家庭服务器(最好使用可公开路由的 IP 和持续运行的机器)来创建或迁移账户。
1. 从 https://peergos.net/public/peergos/releases 下载发布版本
2. 安装 Java - 需要安装 Java >= 25。
3. 运行 Peergos:
```
java -jar Peergos.jar daemon -generate-token true
```
4. 确保您可以监听公共 IP 地址
某些云主机默认不会将您的公共 IP 添加到网络接口。对于这些情况,您可能需要运行类似以下命令:
```
sudo ip address add MY.PUBLIC.IP dev eth0
```
所有 Peergos 数据默认存储在 ~/.peergos 中,可通过环境变量或参数 -PEERGOS_PATH 覆盖
然后您可以通过本地地址打印的 Web 界面进行注册,该地址包含一次性注册令牌。
配置存储在 $PEERGOS_PATH/config 中,因此对于后续运行,您只需使用以下命令,除非您想覆盖任何配置
```
java -jar Peergos.jar daemon
```
请注意,无论您通过哪个 Peergos 服务器注册(您的家庭服务器),该服务器都将存储您的数据,因此如果您不打算永久运行 Peergos 服务器,我们建议在 https://peergos.net 上注册,然后您可以通过本地 Peergos 实例登录,您的所有数据最终都会神奇地出现在 peergos.net 服务器上。Peergos 可以在 NAT 和防火墙后工作,但我们建议使用具有公共 IP 的服务器。如果您想公开暴露您的 Web 界面,您需要安排域名和 TLS 证书(我们建议使用 nginx 和 letsencrypt)。
如果您没有设置域名和 TLS,您仍然可以从另一个 Peergos 实例登录,例如您在笔记本电脑上本地运行的实例——连接通过 P2P TLS1.3 流安全路由到您的家庭服务器。在这种情况下,任何写入都会代理到您的家庭服务器,因此您的数据始终保存在那里。如果您确实通过 DNS 名称和 TLS 证书暴露您的实例,您需要添加以下参数:
如果您还使用 nginx 等反向代理来终止 TLS,您需要使用以下参数告诉 Peergos 您使用的域名:
而且 TLS 证书还需要覆盖应用程序的通配符子域(如 PDF 查看器、文本编辑器、日历和自定义第三方应用)才能正常工作。例如,它应该有覆盖 $YOUR_DOMAIN 和 *.$YOUR_DOMAIN 的 A 记录。
如果您使用 nginx 等反向代理来终止 TLS,以下是一个很好的 nginx 配置文件示例(替换 $YOUR_DOMAIN_NAME)(在启用 SELinux 的 Linux 发行版上,您需要确保允许 nginx 访问 8000 端口的 tcp_socket。):
```
# Peergos 服务器配置
server {
listen 80 default_server;
listen [::]:80 default_server;
location ^~ /.well-known {
allow all;
proxy_pass http://127.0.0.1:8888;
}
# redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
return 301 https://$host$request_uri;
}
server {
# SSL configuration
listen 443 ssl http2;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:!TLS_AES_128_GCM_SHA256;
ssl_certificate /etc/letsencrypt/live/$YOUR_DOMAIN_NAME/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$YOUR_DOMAIN_NAME/privkey.pem;
add_header Strict-Transport-Security "max-age=31536000" always;
server_name $YOUR_DOMAIN_NAME;
client_max_body_size 2M;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
allow all;
}
# pass through for letsencrypt
location ^~ /.well-known {
allow all;
proxy_pass http://127.0.0.1:8888;
}
}
```
## 使用方法 - 自托管(使用 docker)
获取 docker 镜像:
```
docker pull ghcr.io/peergos/web-ui:master
```
运行 Peergos 镜像:
```
docker run --volume $(PEERGOS_PATH):/opt/peergos/data ghcr.io/peergos/web-ui:master daemon -listen-host 0.0.0.0 -public-domain $YOUR_DOMAIN_NAME -public-server true -announce-ipfs-addresses /ip4/$IP/tcp/4001,/ip4/$IP/udp/4001/quic-v1 -log-to-console true
```
## 使用方法 - 自托管(使用 S3 兼容块存储)
按照自托管的说明操作,但添加以下参数(可以在命令行上,也可以在首次运行后的 .peergos/config 文件中):
```
-use-s3 true
-authed-s3-reads true
-direct-s3-writes true
-s3.accessKey $ACCESS_KEY
-s3.bucket $BUCKET
-s3.region $REGION
-s3.region.endpoint $ENDPOINT (e.g. us-east-1.linodeobjects.com)
-s3.secretKey #SECRET_KEY
```
注意:Minio 似乎有一些问题,因此使用 Minio 时请使用:-authed-s3-reads false -direct-s3-writes false
您还需要将桶的 cors.xml 设置为以下内容:
```
https://$YOUR_DOMAIN
HEAD
GET
PUT
*
ETag
Content-Length
3600
```
## 使用方法 - 自托管(使用 Postgres 而不是 sqlite)
按照自托管的说明操作,但添加以下参数(可以在命令行上,也可以在首次运行后的 .peergos/config 文件中):
```
-use-postgres true
-postgres.database $DATABASE
-postgres.host $HOST
-postgres.password $PASSWORD
-postgres.username $USERNAME
```
## 使用方法 - 故障排除
* 您可以使用 "-log-to-console true" 也在控制台上显示日志。
* 首次运行将同步 pki,这需要几分钟。后续运行应在几秒钟内启动。
### CLI
命令行提供了一系列命令。您可以运行 -help 查看可用命令或任何命令或子命令的详细信息。大多数用户只需要 *daemon* 和 *shell* 命令,可能还有 *identity* 或 *fuse*。您可以使用 *migrate* 命令将所有数据迁移到新服务器(在该命令运行的服务器上)。
```
>> java -Djava.library.path=native-lib -jar Peergos.jar -help
Main: Run a Peergos command
Sub commands:
daemon: The user facing Peergos server
shell: An interactive command-line-interface to a Peergos server
fuse: Mount a Peergos user's filesystem natively
quota: Manage quota of users on this server
server-msg: Send and receive messages to/from users of this server
gateway: Serve websites directly from Peergos
migrate: Move a Peergos account to this server
identity: Create or verify an identity proof
ipfs: Install, configure and start IPFS daemon
pki: Start the Peergos PKI Server that has already been bootstrapped
pki-init: Bootstrap and start the Peergos PKI Server
```
或者
```
>> java -Djava.library.path=native-lib -jar Peergos.jar identity -help
identity: Create or verify an identity proof
Sub commands:
link: Link your Peergos identity to an account on another service.
verify: Verify an identity link post from another service.
```
## 镜像
要镜像另一台服务器上的所有数据,首先在任意实例上运行以下命令:
它会要求您输入密码,然后打印三个参数,您需要将这些参数提供给镜像守护进程。
然后在您想要镜像数据的实例上运行守护进程,并提供初始化命令返回的附加参数。
这将持续在该实例上镜像该用户的数据。
## 迁移
要迁移到另一台服务器,首先确保您在该服务器上有足够的配额,然后运行迁移命令。
它会要求您输入用户名和密码,在本地镜像所有数据,然后更新 PKI 使其成为您的家庭服务器。
迁移后,您的身份保持不变,指向您数据的所有链接继续有效,您保留您的社交图谱,无需告诉任何人。
## Shell
可以使用 shell 进行各种操作。
```
java -jar Peergos.jar shell
```
要连接到服务器,您需要提供服务器地址(包括 http/https)、用户名和密码。
```
Enter Server address
> https://peergos.net
Enter username
> demo
Enter password for 'demo'
> **************************************
Generating keys
Logging in
Retrieving Friends
demo@https://peergos.net >
```
显示所有可用命令
```
demo@https://peergos.net > help
```
提示:以下命令可能对初始上传较大文件夹很有用。
```
put local_path remote_path
```
## 同步
有一个双向同步客户端,允许您将本地目录与 Peergos 目录(或多对目录)同步。设置同步的推荐方式是使用桌面/移动应用。运行应用并登录到它打开的浏览器标签页 http://localhost:7777,然后点击左侧边栏中的同步图标。从那里您可以选择主机和 Peergos 文件夹进行同步,以及是否在任一端同步删除。
如果出于某种原因必须使用 CLI,请继续阅读。
要设置此功能,首先运行:
```
>> java -jar Peergos.jar sync init -peergos-url https://peergos.net
```
然后按照提示输入您的用户名、密码和您想要同步的 Peergos 目录。这将输出类似以下内容:
```
>> Run the sync dir command with the following args: -links secret/z59vuwzfFDomTEuyeEw7rkofcd2vt5EnVffmAy5fnQe9V9MG36ZiBVY/3615659421#QUq6mf4gz8uk -local-dirs $LOCAL_DIR
```
然后使用以下命令运行同步客户端:
```
>> java -jar Peergos.jar sync dir -peergos-url https://peergos.net -links secret/z59vuwzfFDomTEuyeEw7rkofcd2vt5EnVffmAy5fnQe9V9MG36ZiBVY/3615659421#QUq6mf4gz8uk -local-dirs /path/to/local/dir
```
## FUSE(Peergos 的原生文件夹挂载)
您可以使用以下命令挂载您的 Peergos 空间
```
>> java -Djava.library.path=native-lib -jar Peergos.jar fuse -peergos-url https://peergos.net -username $username -password $password
```
### MacOS FUSE 前置条件
使用以下命令安装 osxfuse
```
>> brew install --cask osxfuse
```
### Windows FUSE 前置条件
使用以下命令安装 winfsp
```
>> choco install winfsp
```
## WebDAV
您可以运行本地 webdav 桥接器,允许您使用任何 webdav 兼容客户端访问您的 Peergos 文件。运行以下命令(选择任意 webdav 用户名和密码):
```
>> peergos webdav -peergos-url https://peergos.net -username $username -PEERGOS_PASSWORD $password -webdav.username $webdav-username -PEERGOS_WEBDAV_PASSWORD $webdav-password
```
然后您可以通过 http://localhost:8090/$YOUR-USERNAME 浏览您的 home 目录
## 开发
### 依赖项
需要 jdk17 和 ant 来构建。使用以下命令安装依赖项:
#### 在 Debian 上
```
sudo apt-get install ant
sudo apt-get install openjdk-17-jdk
```
#### 在 macOS 上
```
brew install ant # installs openjdk as a dependency
ant -version
Apache Ant(TM) version 1.10.8 compiled on May 10 2020
```
### 构建
请注意,这不包含任何 Web UI。包含 Web 界面的完整构建请参阅 https://github.com/peergos/web-ui
### 交叉编译为 JS
```
ant gwtc
```
### 运行测试
您需要安装 ant-optional:
#### 在 Debian 上
```
sudo apt-get install ant-optional
```
#### 在 macOS 上
macOS 上的 ant 包不需要任何额外内容。
运行测试将自动安装和配置正确版本的 IPFS,运行守护进程,然后终止它。
```
ant test
```
### 开发说明
`ant compile` 目标只会编译 src/peergos/{client,server,shared} 文件夹中的源代码。
标签:IPFS, JS文件枚举, Kali工具, P2P, Streamlit, 分布式系统, 加密, 加密文件系统, 加密邮件, 去中心化, 响应大小分析, 域名枚举, 安全信使, 安全通信, 开源, 抗监控, 数据主权, 数据可视化, 文件存储, 漏洞扫描器, 点对点, 社交网络, 端到端加密, 网络安全, 访问控制, 隐私保护