git在推/拉时加密/解密远程存储库文件

时间:2010-03-16 18:14:40

标签: git encryption

在转移到远程存储库之前,是否可以通过'git push'自动加密文件?并在'git pull'时自动解码它们。

即如果我有一些远程服务器与git存储库共享访问,我不希望我们的项目在未经许可的情况下被盗...... 也许在推拉之前有一些特殊的git-hooks?

5 个答案:

答案 0 :(得分:23)

是和否。

您可以尝试依赖钩子,但假设它们安装在远程位置,并不总是可靠的。

实现几乎相同效果的另一种方法是使用 smudge/clean attribute filter driver ,但不能使用完整的回购

smudge/clean

(来源:Pro Git bookCustomizing Git - Git Attributes

这样涂抹脚本就能解码文件,而干净的脚本会对它们进行编码 同样,这可能适用于一些敏感文件,不适用于完整的回购

当然,这些脚本不会存放在存储库本身,而是通过其他方式进行管理/通信。

由于Alkaline指出in the comments,这个想法无法扩展为回购,因为主要的git维护者Junio C. Hamano comments back in 2009

  

diff.textconv唯一的存在理由是允许潜在的损失   应用于原像和后像的转换(例如msword-to-text)   在给出文本之前的一对内容(应该是“干净的”)   差异化为人类消费。

     

上面的配置似乎可行,但如果你真的想要一个加密的存储库,你应该使用加密文件系统。
  这将为工作树带来额外的好处   与您的存储库相关联的文件也将被加密


即使它没有扩展到完整的回购,但是这个想法已经用 git-crypt 实现了(3年后的2013年),详见Dominic Cerisano的{ {3}}。
git-crypt使用内容过滤器驱动程序(在cpp中实施,answer使用相关.gitattributessmudge设置clean过滤命令)。
作为任何内容过滤器驱动程序,您可以在同一git-crypt文件中将.gitattributes的应用程序限制为所需的文件集:

secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypt

作为commands.cpp

  

git-crypt依赖于未使用加密设计的git过滤器   心里。

     

因此,git-crypt不是加密大多数或最佳的最佳工具   存储库中的所有文件   git-crypt真正闪耀的地方是大多数存储库是公共存储的,但是您需要加密一些文件(可能是名为*.key的私钥或具有API凭据的文件)。

     

要加密整个存储库,请考虑使用类似 mentioned in the README 的系统。

(请参阅git-remote-gcrypt的更多内容, spwhitton/ tech/ code/ git-remote-gcrypt

答案 1 :(得分:12)

您可以查看此项目:https://github.com/shadowhand/git-encrypt

更新:以上项目已弃用,建议使用https://github.com/AGWA/git-crypt

答案 2 :(得分:8)

如何使用git-crypt保护公共和私人远程资产。

  • 对所有git客户端和服务透明(例如GitHub,BitBucket, 等)。
  • Linux,OSX和Windows支持。
  • 资产级别加密(请参阅VonC's answer)。
  • AES-256 cipher。

创建您的256位私钥(保留并保护此密钥)

sudo apt install git-crypt 
mkdir key; cd key;
git init; git-crypt init
git-crypt export-key ~/crypt.key


提交并推送名为.gitattributes的文件到每个repo的根目录。
它应该包含您希望加密的每个文件,目录或类型的一个资产模式:

docs/doc.txt  filter=git-crypt diff=git-crypt
js/**         filter=git-crypt diff=git-crypt
*.java        filter=git-crypt diff=git-crypt
src/cpp/*.h   filter=git-crypt diff=git-crypt


每个仓库中的加密资产:

cd repo-root-directory
git-crypt unlock ~/crypt.key
git-crypt status -f
Commit&Push (from command line or git client)


像往常一样继续您的git工作流程。

  • 在任何新克隆上运行git-crypt unlock ~/crypt.key 一次 这些安全的回购。
  • 您可能希望在所有分支上清除旧的未加密的提交历史记录 和标签。
  • 如果你使用git客户端,它必须完全支持git过滤器和差异。



答案 3 :(得分:6)

有两种方法可以做到这一点。

一个是使用像git-crypt这样的项目, http://www.agwa.name/projects/git-crypt/ 它可以为拉动和推动过程添加更多功能,或者按照此处所述手动设置过滤器 https://gist.github.com/shadowhand/873637

如果你在linux环境中工作,另一种方法是使用ecryptfs。对于这种情况,例如,在项目目录的基础上,您可以创建两个目录

project/encrypted_src

project/src

然后从项目目录的根目录中使用命令

挂载
sudo mount -t ecryptfs encrypted_src src

输入密码并在提示时接受默认值。此时,放在src /中的文件将被动态加密为encrypted_src /。当你完成后

sudo umount src

只保留加密文件。本质上文件是从encrypted_src提交和推送的,并在src中编辑。 只要每个人都使用相同的密码短语(或使用相同密钥安装),repo就可以在开发人员之间共享。你也可以变得更加漂亮。您可以加密文件名以及文件内容,或使用不同的密码短语或密钥加密仓库中的不同文件夹。如果您的配置文件具有敏感的访问信息,以便各个组(开发,测试,生产)希望私下维护,那么最后一个功能就不错了。

尽管如此,请注意,一旦你开始加密东西。你失去了很多源代码控制的优点,比如能够看到各种提交之间的差异。如果您有任何规模的项目,审查提交的能力将是非常宝贵的。如果你期望在某些时候出现错误,那么通过提交历史记录进行反向跟踪来分析和找到引入点的能力也是非常宝贵的。因此,首先保护您的服务器,然后仅在有意义的地方使用加密来保护源代码管理中的敏感信息。我的2美分。

答案 4 :(得分:1)

git-annex提供了Tahoe-LAFS挂钩,这可能比您需要的更复杂。

相关问题