xbxbxb462-cpu/sherd
GitHub: xbxbxb462-cpu/sherd
一款面向极端威胁模型的离线命令行加密工具,提供合理推诿、Shamir 秘密共享和全面的内存防护能力。
Stars: 0 | Forks: 0
sherd
为真正需要保密的人提供的离线、单二进制文件加密工具。
Sherd 是一款命令行加密工具,其构建基于一个假设:对手具有专业能力。它使用通过 **Argon2id** 和 **HKDF-SHA256** 派生的密钥,或用于非对称交换的 **X25519 接收者密钥**,通过 **AES-256-GCM** 加密消息和文件。它通过不可区分的诱饵槽位支持**合理推诿**,在 GF(256) 上支持 **Shamir Secret Sharing**,以及一种会掩盖明文长度的**偏执模式**。 每个密钥缓冲区都被包装在 `Zeroizing<…>` 中并在 drop 时被擦除。整个进程地址空间通过 `mlockall(MCL_CURRENT | MCL_FUTURE)` 被锁定以防止交换。Core dump 已被禁用。解密在各个槽位和数据块之间以统一的时间运行。没有配置文件,没有网络,没有遥测,没有插件加载器。 ## 为什么选择 Sherd? 大多数加密工具都以便利性为目标进行优化。Sherd 则针对对手具有专业能力和明确动机的情况进行了优化。 - **内存被锁定,而不仅仅是归零。** `mlockall(MCL_CURRENT | MCL_FUTURE)` 防止内核将进程的任何页面交换到磁盘。Core dump 通过 `setrlimit(RLIMIT_CORE, 0)` 和 `prctl(PR_SET_DUMPABLE, 0)` 被禁用。冷重启攻击者什么也找不到。 - **合理推诿是真实的,而不是虚张声势。** 每个密码加密的文件都有两个不可区分的槽位。在胁迫下,你只需透露诱饵密码;对手无法证明第二个槽位的存在。两个槽位都是带有有效提交标签的有效 AES-256-GCM 密文,并被填充到相同的随机化长度。 - **解密采用统一时间。** 无论提交标签是否匹配,每个槽位的每个数据块都会被处理。错误的密码与正确的密码花费相同的实际时间。这关闭了否则会破坏合理推诿的时间侧信道。 - **Shamir 共享不会泄露任何信息。** 无论密钥长度如何,共享份额都是固定的 4098 字节。阈值 K 和总数 N 不会存储在任何共享份额中。截获其中一个份额的人无法得知法定人数或密钥大小。 - **没有配置攻击面。** 没有配置文件,没有插件加载器,没有网络。恶意的环境变量无法降级 KDF 或禁用填充。每个与安全相关的参数都是硬编码的,或者在命令行中明确指定。 - **用于非对称交换的接收者模式。** 加密到 X25519 公钥(`sherd1...`)。没有密码,没有 Argon2id,即时加密和解密。每个接收者都会获得一个独立的 stanza;任何单个接收者的身份都可以进行解密。 有关完整的协议规范,请参阅 [`docs/protocol.md`](docs/protocol.md)。 ## 目录 - [快速入门](#quickstart) - [安装](#install) - [使用方法](#usage) - [密码加密](#passphrase-encryption) - [接收者加密 (X25519)](#recipient-encryption-x25519) - [合理推诿](#plausible-deniability) - [Shamir 共享](#shamir-secret-sharing) - [不解密进行检查](#inspect-without-decrypting) - [安全模型](#security-model) - [文件格式](#file-format) - [常见问题](#faq) - [贡献](#contributing) - [许可证](#license) ## 快速入门 ``` # 从源码构建(需要 Rust 1.74+) git clone https://github.com/xbxbxb462-cpu/sherd.git cd sherd cargo install --path . # 允许无 root 下进行内存锁定 sudo setcap cap_ipc_lock=ep "$(which sherd)" # 使用密码加密消息(stdin → stdout) echo "top secret" | sherd encrypt > msg.shrd.asc # 解密 sherd decrypt -i msg.shrd.asc ``` 对于基于接收者的加密(没有密码,只需公钥): ``` sherd keygen -o alice.key # writes SHERD-SECRET-KEY-1... (mode 0600) sherd keygen -y -i alice.key # prints: sherd1... echo "for alice" | sherd encrypt -r sherd1... > for-alice.shrd.asc sherd decrypt -I alice.key -i for-alice.shrd.asc ``` ## 安装 ### 从源码构建 需要 Rust 1.74 或更高版本。 ``` git clone https://github.com/xbxbxb462-cpu/sherd.git cd sherd cargo install --path . ``` 生成的二进制文件位于 `~/.cargo/bin/sherd`。 ### 内存锁定 Sherd 在 release 模式下运行的前提是能够锁定其地址空间以防止交换。选择以下一种方式: ``` # 选项 A:授予一次 capability sudo setcap cap_ipc_lock=ep "$(which sherd)" # 选项 B:为所有用户提高 memlock rlimit echo '* soft memlock unlimited' | sudo tee -a /etc/security/limits.conf echo '* hard memlock unlimited' | sudo tee -a /etc/security/limits.conf # 注销并重新登录 ``` 在 debug 构建中,设置 `SHERD_ALLOW_NO_MLOCK=1` 会被接受,但会发出明显的警告。在 release 构建中,该变量会被拒绝。 ### 验证二进制文件 ``` sherd hash # prints the SHA-256 of the running binary sherd selftest # runs Argon2id / HKDF / HMAC / AES-GCM known-answer tests ``` ## 使用方法 Sherd 有九个子命令。运行 `sherd --help` 获取完整列表,或运行 `sherd标签:Rust, 加密工具, 可视化界面, 密码学, 手动系统调用, 文件加密, 网络安全, 网络流量审计, 通知系统, 隐私保护