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, 上游代理, 二进制发布, 云配置检测, 保密性, 信息安全, 加密, 安全可观测性, 安全测试工具, 密码存储, 对称加密, 开源工具, 敏感数据, 数据保护, 数据擦除, 文件过滤器, 混合内容, 源码安全, 漏洞扫描器, 版本控制, 网络安全研究, 自动化审计, 访问控制, 透明加密, 非对称加密