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

Unc*_*MiF 41 git encryption

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

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

Von*_*onC 23

是的,不是.

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

实现几乎相同效果的另一种方法是使用涂抹/清除属性过滤器驱动程序,但不能用于完整存储库.

黑灰/清洁

(来源:Pro Git书:自定义Git - Git属性)

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

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

正如Alkaline 在评论中指出的那样,这个想法并不适用于回购,因为主要的git维护者Junio C. Hamano在2009年回顾:

作为唯一的存在理由diff.textconv是允许在给予人类消费文本差异之前应用于原像和postimage内容对(可能是"干净的")的潜在有损转换(例如,msword-to-text).

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


尽管它没有扩展到完整的回购,但这个想法已经实现(3年后的2013年)git-crypt,详见Dominic Cerisano回答.
git-crypt使用内容过滤器驱动程序(CPP中实现的,与commands.cpp设置您的.gitattributes有关smudgeclean过滤命令).
作为任何内容筛选器驱动程序,您可以git-crypt在同一.gitattributes文件中将应用程序限制为所需的文件集:

secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypt
Run Code Online (Sandbox Code Playgroud)

如下所述README:

git-crypt 依赖于git过滤器,它们的设计并未考虑加密.

因此,git-crypt它不是加密存储库中大多数或所有文件的最佳工具.
git-crypt真正的亮点是大多数存储库中是公开的,但你有几个文件(或许私钥命名*.key,你需要加密,或者API凭证的文件).

要加密整个存储库,请考虑使用类似的系统git-remote-gcrypt.

(更多信息见spwhitton/tech/code/git-remote-gcrypt,来自Sean Whitton)


Llu*_*uís 12

你可以看看这个项目:https://github.com/shadowhand/git-encrypt

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

  • 为什么这会被投票?是不好的解决方案? (5认同)

Dom*_*ano 8

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

  • 对所有git客户端和服务(例如GitHub,BitBucket等)透明.
  • Linux,OSX和Windows支持.
  • 资产级加密(参见VonC的回答).
  • AES-256密码.

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

sudo apt install git-crypt 
mkdir key; cd key;
git init; git-crypt init
git-crypt export-key ~/crypt.key
Run Code Online (Sandbox Code Playgroud)


提交并推送一个调用.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
Run Code Online (Sandbox Code Playgroud)


加密每个仓库中的资产:

cd repo-root-directory
git-crypt unlock ~/crypt.key
git-crypt status -f
Push (from command line or git client)
Run Code Online (Sandbox Code Playgroud)


像往常一样继续你的git工作流程.

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




小智 6

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

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

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

project/encrypted_src

project/src
Run Code Online (Sandbox Code Playgroud)

然后从项目目录的根目录中使用该命令进行装载

sudo mount -t ecryptfs encrypted_src src
Run Code Online (Sandbox Code Playgroud)

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

sudo umount src
Run Code Online (Sandbox Code Playgroud)

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

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