Skip to content

git-crypt 官方文档中文翻译

git-crypt - Git 中的透明文件加密

git-crypt 使 Git 仓库中的文件可以实现透明的加密和解密。您可以选择需要保护的文件,在提交时进行加密,在检出时进行解密。git-crypt 可以让您自由共享包含公共和私有内容的仓库。即使开发者没有密钥,git-crypt 也能让其实现克隆和提交含有加密文件的仓库。这样,您可以将秘密资料(如密钥或密码)存储在与代码相同的仓库中,而不需要锁定整个仓库。

git-crypt 是由 Andrew Ayeragwa@andrewayer.name )编写的。 更多信息,请访问 https://www.agwa.name/projects/git-crypt

构建 git-crypt

参考 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

.gitattributes 文件跟 .gitignore 类似,可以匹配通配符,并且应该提交到仓库里。更多信息可以查看下方内容。请确认不要错误地加密了 .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.7.0,发布于 2022-04-21。git-crypt 旨在实现无缺陷且可靠,即它不应崩溃、失效或泄露您的机密数据。然而,它尚未成熟,即它的文档、功能丰富性或易用性尚未达到应有的水平。此外,在 1.0 版本之前,可能会引入不向后兼容的变更。

安全性

git-crypt 比其他透明的 git 加密系统更安全。 git-crypt 使用 AES-256 在 CTR 模式下加密文件,并使用从文件的 SHA-1 HMAC 派生的合成 IV。 这种操作模式在确定性选择明文攻击下被证明是语义安全的。 这意味着尽管加密是确定性的(这是必需的,以便 git 可以区分文件是否已更改), 但它不会泄露任何信息,只会暴露两个文件是否相同。 其他透明的 git 加密方案使用 ECB 或 CBC 模式和固定 IV。这些系统在语义上不安全,会泄露信息。

局限性

git-crypt 依赖于 git 过滤器,而这些过滤器并非为加密设计。因此,git-crypt 并非加密版本库中大多数或全部文件的最佳工具。git-crypt 真正擅长的是这样一种场景:你的版本库绝大多数内容是公开的,但其中有一些文件(可能是一组命名为*. key 的私钥,或是一个含有 API 凭证的文件)需要加密。如果需要加密整个版本库,考虑使用 git-remote-gcrypt 这类工具。(注:本文不对 git-remote-gcrypt 的安全性作出评价。)

git-crypt 不会加密文件名、提交信息、符号链接目标、gitlink 或其他元数据。

git-crypt 无法隐藏文件是否发生更改、文件长度,或者两个文件完全相同这一事实(参见上方“安全性”部分)

git-crypt 并不支持撤销对之前已授予访问权限的加密仓库的访问。这既适用于多用户 GPG 模式(没有 del-gpg-user 命令来补充 add-gpg-user),也适用于对称密钥模式(不支持轮换密钥)。这是因为,在历史数据的背景下,这是一个固有的复杂问题。例如,即使某个时刻密钥被轮换了,拥有之前密钥的用户仍然可以访问之前的仓库历史。这个问题在 https://github.com/AGWA/git-crypt/issues/47 中有更详细的讨论。

使用 git-crypt 加密的文件无法被压缩。即使对加密文件做了最微小的改动,git 也得存储改动后的整个文件,而不是仅仅存储改动部分。

虽然 git-crypt 使用 SHA-1 HMAC 保护单个文件内容,但如果整个仓库没有做防篡改保护,git-crypt 就不能安全使用(如果攻击者可以篡改你的仓库,他们就可以修改你的. gitattributes 文件来禁用加密)。如果必要,可以使用 git 的特性,例如签名标签,而不是仅仅依靠 git-crypt 来保证完整性。

使用 git-crypt 加密的文件不能用 git-apply 打补丁,除非补丁本身也是加密的。要生成一个加密的补丁,可以使用命令 git diff --no-textconv --binary ​。或者,你也可以在 git 外部使用 patch 命令来打明文补丁。

git-crypt 在一些第三方 git 图形用户界面(GUI)上无法可靠工作,例如 Atlassian SourceTree 和 GitHub for Mac。文件可能会保持未加密状态。

Gitattributes 文件

.gitattributes 文件的文档位于 gitattributes (5) 手册页面中。文件匹配模式与. gitignore 中使用的格式相同,详情可参见 gitignore (5) 手册页面,但需要注意的是,仅指定一个目录(例如 /dir/ ​)不足以对该目录下的所有文件进行加密。

另请注意,dir/* ​模式不会匹配 dir ​子目录下的文件。如果要加密整个 dir ​子树,请使用 dir/** ​:

dir/** filter=git-crypt diff=git-crypt

.gitattributes 文件不能被加密,因此请确保通配符不会意外地匹配到它。如有必要,你可以像这样将 .gitattributes 排除在加密之外:

.gitattributes !filter !diff

最后更新于:

MIT License.