AGWA/git-crypt
GitHub: AGWA/git-crypt
在 git 仓库中实现文件的透明加密与解密,让敏感信息可以安全地与代码共存于同一仓库。
Stars: 9475 | Forks: 520
# git-crypt - git 中的透明文件加密
git-crypt 实现了 git 仓库中文件的透明加密和解密。您选择保护的文件在提交时会被加密,在检出时会被解密。git-crypt 让您能够自由地共享包含公开和私有内容混合的仓库。git-crypt 支持优雅降级,因此没有密钥的开发者仍然可以克隆并提交包含加密文件的仓库。这使您可以将秘密资料(例如密钥或密码)与代码存储在同一个仓库中,而无需锁定整个仓库。
git-crypt 由 [Andrew Ayer](https://www.agwa.name) (agwa@andrewayer.name) 编写。
欲了解更多信息,请参阅 。
## 构建 git-crypt
请参阅 [INSTALL.md](INSTALL.md) 文件。
## 使用 git-crypt
配置仓库以使用 git-crypt:
```
cd repo
git-crypt init
```
通过创建 .gitattributes 文件来指定要加密的文件:
```
secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypt
secretdir/** filter=git-crypt diff=git-crypt
```
与 .gitignore 文件类似,它可以匹配通配符,并且应该被提交到仓库中。关于 .gitattributes 的更多信息,请参阅下文。
请确保不要意外加密 .gitattributes 文件本身(或其他 git 文件,如 .gitignore 或 .gitmodules)。请确保在添加敏感文件*之前*配置好 .gitattributes 规则,否则这些文件将不会被加密!
使用 GPG 与他人(或您自己)共享仓库:
```
git-crypt add-gpg-user USER_ID
```
`USER_ID` 可以是密钥 ID、完整指纹、电子邮件地址,或任何其他能向 GPG 唯一标识公钥的内容(请参阅 gpg 手册页中的 "HOW TO SPECIFY A USER ID")。注意:`git-crypt add-gpg-user` 将在仓库根目录的 .git-crypt 目录中添加并提交一个 GPG 加密的密钥文件。
或者,您可以导出对称密钥,并将其安全地传达给协作者(不需要 GPG,也不会向您的仓库添加任何文件):
```
git-crypt export-key /path/to/key
```
在克隆包含加密文件的仓库后,使用 GPG 解锁:
```
git-crypt unlock
```
或使用对称密钥:
```
git-crypt unlock /path/to/key
```
这就是您需要做的全部工作 - 在设置好 git-crypt 后(通过 `git-crypt init` 或 `git-crypt unlock`),您可以正常使用 git - 加密和解密是透明进行的。
## 当前状态
git-crypt 的最新版本是 [0.8.0](NEWS.md),发布于 2025-09-23。git-crypt 力求无错误且可靠,这意味着它不应崩溃、发生故障或泄露您的机密数据。然而,它尚未达到成熟阶段,这意味着其文档、功能和易用性还有待完善。此外,在 1.0 版本之前可能会引入向后不兼容的更改。
## 安全性
git-crypt 比其他透明的 git 加密系统更安全。git-crypt 使用 AES-256 CTR 模式加密文件,并使用从文件的 SHA-1 HMAC 派生的合成 IV。这种操作模式在确定性选择明文攻击下被证明是语义安全的。这意味着虽然加密是确定性的(这是 git 区分文件是否更改所必需的),但除了判断两个文件是否相同之外,它不会泄露任何信息。其他透明的 git 加密方案使用 ECB 或固定 IV 的 CBC。这些系统在语义上不安全,并且会泄露信息。
## 局限性
git-crypt 依赖于 git 过滤器,而过滤器在设计时并未考虑加密。因此,git-crypt 并不是加密仓库中大部分或所有文件的最佳工具。git-crypt 真正的亮点在于您的仓库大部分是公开的,但您有一些文件(可能是名为 *.key 的私钥,或包含 API 凭证的文件)需要加密。对于加密整个仓库,请考虑改用 [git-remote-gcrypt](https://spwhitton.name/tech/code/git-remote-gcrypt/) 这样的系统。(注意:不对 git-remote-gcrypt 的安全性作任何背书。)
git-crypt 不加密文件名、提交消息、符号链接目标、gitlinks 或其他元数据。
git-crypt 不会隐藏文件是否更改、文件长度或两个文件相同的事实(请参阅上面的“安全性”部分)。
git-crypt 不支持撤销先前授予的加密仓库访问权限。这适用于多用户 GPG 模式(没有 del-gpg-user 命令来补充 add-gpg-user)以及对称密钥模式(不支持密钥轮换)。这是因为这在历史数据的上下文中是一个固有的复杂问题。例如,即使密钥在历史的某个时刻被轮换,拥有先前密钥的用户仍然可以访问先前的仓库历史。这个问题在 中有更详细的讨论。
使用 git-crypt 加密的文件不可压缩。即使对加密文件进行最小的更改,也需要 git 存储整个更改后的文件,而不仅仅是增量。
尽管 git-crypt 使用 SHA-1 HMAC 保护单个文件内容,但除非整个仓库受到防篡改保护(能够篡改您的仓库的攻击者可以更改您的 .gitattributes 文件以禁用加密),否则无法安全地使用 git-crypt。如有必要,请使用签名标签等 git 功能,而不仅仅依赖 git-crypt 来保证完整性。
使用 git-crypt 加密的文件无法通过 git-apply 打补丁,除非补丁本身是加密的。要生成加密补丁,请使用 `git diff --no-textconv --binary`。或者,您可以使用 patch 命令在 git 之外应用明文补丁。
git-crypt 无法在某些第三方 git GUI(如 [Atlassian SourceTree](https://jira.atlassian.com/browse/SRCTREE-2511) 和 GitHub for Mac)中可靠地工作。文件可能会处于未加密状态。
## Gitattributes 文件
.gitattributes 文件记录在 gitattributes(5) 手册页中。文件模式格式与 gitignore(5) 手册页中记录的 .gitignore 使用的格式相同,例外情况是仅指定目录(例如 `/dir/`)*不足以*加密其下的所有文件。
另请注意,模式 `dir/*` 不会匹配 dir/ 子目录下的文件。要加密整个子树 dir/,请使用 `dir/**`:
```
dir/** filter=git-crypt diff=git-crypt
```
.gitattributes 文件不得被加密,因此请确保通配符不会意外匹配到它。如有必要,您可以像这样将 .gitattributes 排除在加密之外:
```
.gitattributes !filter !diff
```
标签:C++, DevSecOps, git, git-filter, GPG, meg, ProjectDiscovery, SamuraiWTF, Streamlit, 上游代理, 二进制发布, 云配置检测, 保密性, 信息安全, 加密, 安全可观测性, 安全测试工具, 密码存储, 对称加密, 开源工具, 敏感数据, 数据保护, 数据擦除, 文件过滤器, 混合内容, 源码安全, 漏洞扫描器, 版本控制, 网络安全研究, 自动化审计, 访问控制, 透明加密, 非对称加密