用于弹性数据的协议内省分块适配器
献给自学成才者、不走寻常路者,以及所有曾被劝诫要安分守己的人。继续构建,继续探索。
PICARD 会加密你的数据,将其切分成块,再把这些块分散到你配置的任意协议端点:DNS TXT 记录、社交媒体 API、MQTT broker、S3 存储桶、蓝牙广播,或同时使用以上全部。取回时,它会重新组装。借助多适配器分散机制,没有任何单一端点持有足以重建任何内容的密文。没有中央服务器。没有每月存储费用。它作为常规文件系统挂载。
不追求高效。协议无关。
[!IMPORTANT] 研究项目。 PICARD 是一个可运行的计算机科学实验,而非生产级存储系统。继续之前请阅读研究与法律声明。
[!WARNING] 实验性:风险自负。 这些适配器将硬件漏洞用作存储原语。结果因硬件而异,在不同机器上具有非确定性,并且在 DRAM 位翻转的情况下不可逆。仅在你拥有并控制的硬件上使用。针对共享或云基础设施运行在大多数司法管辖区属于未经授权访问。
PICARD 现在可以将块存储在 DRAM 位状态和 CPU 缓存驻留中——完全处于操作系统的视野之外。
| 适配器 | 功能 |
|---|---|
rowhammer | 通过反复冲击相邻 DRAM 行直到电荷泄漏翻转目标位来写入位。通过直接检查受害行来读取。本地、短暂、非 ECC DDR3/4。 |
halfdouble | 两跳变体。近/远攻击者比例绕过 DDR4 目标行刷新(TRR)。可触及经典 rowhammer 不再影响的硬件。 |
throwhammer | 通过 RDMA 冲击远程主机的 DRAM。远程 CPU 完全不参与——NIC 直接 DMA 读取到 DRAM。需要 RDMA 网络结构。 |
cpu-cache | 通过 Flush+Reload 将位存储在 CPU L3 SRAM 中。N_REPS=5 多数投票编码,跨页隔离槽位。在 i7-12700KF 上 BER 低于 5e-4。同一主机上的跨进程;在页面去重启用时的跨 VM。 |
这四个适配器都是短暂的(断电即擦除)。硬件要求和威胁模型见 docs/adapters.md。
plaintext
→ AES-256-GCM encrypt (Argon2id key, per-block salt + nonce)
→ PCHK chunk (protocol-sized pieces)
→ scatter across adapters (DNS, Redis, Reddit, S3, MQTT, …)
→ sealed envelope (HKDF sub-key, correlation tag per adapter)
retrieve
← fan out to all adapters
← collect, verify, assemble
← decrypt
每个块都使用各自的随机盐和 nonce 独立加密。数据块以轮询方式或通过 RAID 配置分散存储。没有任何适配器能看到明文;也没有任何适配器能看到足以重建任何内容的密文。
本地索引(一个 AES-256-GCM 加密的 SQLite 数据库)将路径映射到数据块位置。丢失口令短语,就丢失数据。
那是一个凉爽的柏林早晨。我从露台凝视着一堵普通的灰泥墙,墙顶覆着红砖。一片翅膀的模糊影子吸引了我的目光,一只小鸟转向飞入屋檐线附近的一个排水孔,消失了。另一个头从不同的孔中探出,啾啾叫着。五个排水孔,五个巢。排水沟本是为了排水,而不是容纳家庭,然而这些鸟却找到了庇护、掩护和便捷的通道。我从未注意到,因为我从未费心去看。
我们的数字基础设施承载的东西比它设计用来存储的更多。DNS TXT 记录在规范内接受任意文本。MQTT 保留消息将数据持久化在代理上。ICMP 回显数据包携带一个负载字段。社交媒体 API 接受自由格式的结构化文本。这些协议中的每一个都定义了用于元数据、发现或诊断的字段。这些字段可以像其设计者预期用途一样承载字节。
Medium:一堵墙、一些鸟,以及我们未曾留意的互联网协议,Christopher Neitzert,2025 年 5 月
picard web 在 http://localhost:8471 打开一个浏览器仪表盘。
按类别划分的存储面、适配器健康状况和加密详情一览。
259 个适配器可按类别浏览,包含必需参数和一键添加。
pip install picard-store
export PICARD_PASSPHRASE="your-passphrase" # or picard will prompt
picard init # create picard.toml
# edit picard.toml to add your adapters, then:
picard put myfile.txt --as /docs/myfile.txt
picard get /docs/myfile.txt -o recovered.txt
picard ls
picard tree /
来源:
git clone https://github.com/neitzert/picard
cd picard
pip install -e ".[dev]"
python -m pytest --tb=short -q
# picard.toml
[general]
block_size = 65536
[[adapters]]
name = "dns-primary"
type = "dns"
enabled = true
params = { nameserver = "10.10.10.10", domain = "chunks.example.com" }
[[adapters]]
name = "s3-backup"
type = "s3"
enabled = true
tor_proxy = true # route through Tor SOCKS5
params = { bucket = "picard-chunks", prefix = "data/" }
[[adapters]]
name = "reddit-stash"
type = "reddit"
enabled = true
browser_mode = "headed" # api | headless | headed
params = { subreddit = "u_myuser" }
[[raid]]
level = "raid5"
adapters = ["dns-primary", "s3-backup", "filesystem"]
[scatter.paranoid]
raid_level = "raid10"
min_adapters = 4
Scatter 配置文件: quiet、resilient、speed、paranoid
| 命令 | 描述 |
|---|---|
picard put <file> --as <path> | 存储文件 |
picard get <path> -o <file> | 检索文件 |
picard ls [path] | 列出文件 |
picard rm <path> | 删除 |
picard cp / mv | 复制 / 重命名 |
picard tree / | 目录树 |
picard verify <path> | 分块完整性检查 |
| 命令 | 描述 |
|---|---|
picard mkdir / ln / head / tail / touch / log / stat / find | 标准文件系统操作 |
picard fsck | 一致性检查与修复 |
picard mount <mountpoint> | FUSE 挂载 |
picard webdav | WebDAV 服务器(端口 8471) |
| 命令 | 描述 |
|---|---|
picard web | Web 仪表板(深色/浅色,拖放) |
picard scatter-report | 存储表面映射 |
picard adapters / profiles | 列出适配器和 scatter 配置文件 |
picard recover | 日志崩溃恢复 |
picard tor-check / tor-serve / tor-peer / tor-mount | Tor 操作 |
picard init | 创建默认 picard.toml |
大多数命令接受 --json 以输出机器可读格式。
picard mount 通过 FUSE 暴露虚拟文件系统。标准 shell 工具均可使用:cp、ls、mv、rm、mkdir、cat、chmod、ln -s 和 df 均按预期工作。
平台要求:
| 平台 | 要求 |
|---|---|
| Linux | sudo apt install libfuse-dev(或发行版等效命令) |
| macOS | brew install --cask macfuse |
| Windows | WinFSP,或使用 picard webdav 配合资源管理器的映射网络驱动器 |
已知限制: 不支持硬链接,不支持文件锁定(flock/fcntl)。写入时会将整个文件缓冲在 RAM 中,并在关闭时刷新。请勿在挂载点内直接运行 SQLite WAL 模式或 Git 对象存储。
picard webdav 是零驱动的替代方案。启动它,将资源管理器、Finder 或 Nautilus 指向 http://localhost:8471,然后拖入文件即可。
PICARD 将存储工具作为 MCP 服务器暴露给 Claude 及其他兼容 MCP 的代理:
{
"mcpServers": {
"picard-store": {
"command": "picard-mcp",
"env": { "PICARD_PASSPHRASE": "your-passphrase" }
}
}
}
有关可用工具和设置详情,请参阅 docs/mcp.md。
按授权要求分为四个层级,共 264 个适配器。完整列表:docs/adapters.md。
无需第三方授权。这些是主要用例。
| 类别 | 示例 |
|---|---|
| 本地 / 数据库 | Filesystem、Redis、PostgreSQL、S3、SQLite、etcd、CouchDB、Cassandra |
| 自托管服务 | WebDAV、Matrix(自有 homeserver)、MQTT(自有 broker)、XMPP、IRC |
| 邮件 / 日历 | SMTP/IMAP、CalDAV、CardDAV |
| P2P / 去中心化 | IPFS、BitTorrent DHT、Nostr、Ethereum(自有钱包)、Tor 隐藏服务 |
| 隐写术 | 图像 LSB、音频 WAV LSB、EXIF、XLSX 隐藏单元格、ZIP 注释 |
需要在相关平台上拥有有效账户和 API 授权。每个适配器的源代码中都包含特定于平台的服务条款声明。
| 类别 | 示例 |
|---|---|
| 社交 | Bluesky、Reddit、Discord、Telegram、Mastodon、Twitter/X、Tumblr |
| 媒体 | YouTube、TikTok、Spotify、SoundCloud、Imgur、Flickr、Twitch |
| 专业 | LinkedIn、GitHub、Slack、Notion、HuggingFace、Medium、Hacker News、Pinterest、Steam |
| 包注册表 | PyPI、npm、crates.io、RubyGems |
关于包注册表适配器(PyPI、npm、crates.io、RubyGems)的说明: 这些是研究演示。其中一些在其写入路径中包含有意设置的障碍,阻止开箱即用地针对公共注册表使用。如果某个适配器静默成功但数据未出现,或失败并出现意外的协议错误,请阅读源代码。每种情况下的修复都是一处小型的、有意的更改。这是设计使然。
授权要求因司法管辖区、频率和设备类型而异。使用前请阅读每个适配器源代码中的监管声明。
| 类别 | 示例 |
|---|---|
| 无线电 | LoRa/LoRaWAN、SDR(无许可证时仅接收)、WiFi 信标、AX.25/业余无线电 |
| 短距离 | Bluetooth LE、NFC、ZigBee |
| 硬件总线 | CAN 总线(仅限自有硬件)、USB-HID、串行 |
[!WARNING] 仅在您拥有并控制的硬件上运行。结果因硬件而异,且在不同机器上具有非确定性。DRAM 位翻转在不重启电源的情况下不可逆。针对共享或云基础设施运行在大多数司法管辖区属于未经授权的访问。