gitencryption/解密远程存储库文件,同时推/拉
在传输到远程存储库之前,是否可以通过“git push”自动encryption文件? 并且在'git pull'时自动解码它们。
也就是说,如果我有一个远程服务器与共享访问存储在那里,我不希望我们的项目被盗取没有许可…也许有一些特殊的git钩之前,推后拉?
是和不是。
你可以试着依靠钩子,但是假设它们被安装在远程位置,这并不总是可靠的。
另一种达到几乎相同效果的方法是使用一个smudge / clean属性filter驱动程序 , 但不能用于完整的回购 。
(来源: Pro Git书籍 : 自定义Git – Git属性 )
这样,污迹脚本就可以解码文件,而干净的脚本会对它们进行编码。
再次,这可能适用于一些敏感的文件, 而不是一个完整的回购 。
当然,这些脚本不会在存储库本身,并将以另一种方式进行pipe理/沟通。
正如Alkaline 在评论中指出的那样,这个想法并没有规模回购,因为主要的git维护者Junio C. Hamano在2009年回应说 :
由于
diff.textconv
的唯一存在理由是允许在给予文本差异之前将潜在有损耗的转换(例如msword到文本)应用于原像和后像对内容(应该是“干净的”)人类消费。上面的configuration似乎可以工作,但是如果你真的想要一个encryption的仓库,你应该使用一个encryption文件系统。
这会带来额外的好处,即与您的资源库关联的工作树也将被encryption 。
尽pipe它没有扩展到完整的回购,但是这个想法是在git-crypt
实现的(3年之后),详见Dominic Cerisano的回答 。
git-crypt
使用内容filter驱动程序 (在cpp中实现,通过commands.cpp
使用相关的smudge
和clean
filter命令设置.gitattributes
)。
作为任何内容filter驱动程序,您可以在相同的.gitattributes
文件.gitattributes
git-crypt
的应用程序限制为所需的一组文件:
secretfile filter=git-crypt diff=git-crypt *.key filter=git-crypt diff=git-crypt
如README
中所述 :
git-crypt
依赖于gitfilter,而gitfilter并没有考虑到encryption的devise。因此,
git-crypt
不是encryption存储库中大部分或全部文件的最佳工具。
git-crypt
真正用处在于你的大部分版本库都是公开的,但是你需要encryption一些文件(可能是私钥名为*.key
,或者是一个带有API凭证的文件)。要encryption整个存储库,请考虑使用像
git-remote-gcrypt
这样的系统。
你可以看看这个项目: https : //github.com/shadowhand/git-encrypt
更新 :这个上面的项目已被弃用,并build议使用https://github.com/AGWA/git-crypt
如何使用git-crypt保护公共和私有的远程资产。
- 对所有的git客户端和服务都是透明的(例如,GitHub,BitBucket等)。
- Linux,OSX和Windows支持。
- 资产级encryption(请参阅VonC的答案 )。
- AES-256密码。
创build您的256位私钥(保留并保护此密钥)
sudo apt install git-crypt mkdir key; cd key; git init; git-crypt-init git-crypt export ~/crypt.key
提交 .gitattributes
一个名为.gitattributes
的文件推送到每个.gitattributes
的根目录。
它应该包含您希望encryption的每个文件,目录或types的资产模式:
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
在每个回购中encryption资产:
cd repo-root-directory git-crypt unlock ~/crypt.key git-crypt status -f Commit&Push (from command line or git client)
像往常一样继续你的git工作stream程。
- 在这些安全回购的任何新克隆上运行一次
git-crypt unlock ~/crypt.key
。 - 您可能希望清除所有分支机构和标签上的旧未encryption的提交历史logging。
- 如果你使用一个git客户端,它必须完全支持gitfilter和差异。
有两种方法可以做到这一点。
一个是使用像git-crypt这样的项目, http: //www.agwa.name/projects/git-crypt/,它添加了用于拉和推的过程,或者手动设置filter,如https:// gist.github.com/shadowhand/873637
如果你在linux环境下工作,另一种方法是使用ecryptfs。 对于这种情况,例如,可以在您的项目目录的基础上创build两个目录
project/encrypted_src project/src
然后从项目目录的根目录下使用命令装载
sudo mount -t ecryptfs encrypted_src src
input密码并在提示时接受默认值。 此时,放置在src /中的文件将被encryption为encrypted_src / on。 当你完成了
sudo umount src
只有encryption的文件保留。 基本上文件被提交并从encryption的src /推送并在src中编辑。 只要每个人都使用相同的密码(或使用相同的密钥),回购可以在开发人员之间共享。 你也可以得到更好的。 您可以encryption文件名以及文件内容,也可以使用不同的密码或密钥encryption回购库中的不同文件夹。 如果你的configuration文件具有敏感的访问信息,个别组(开发,testing,生产)将要私人维护,最后一个function是很好的。
尽pipe如此,请注意,一旦你开始encryption的东西。 你放松了很多源代码pipe理的优点,比如能够看到各种提交之间的差异。 如果你有任何规模的项目,审查提交的能力将是非常宝贵的。 如果您希望在某个时候出现错误,那么通过提交历史logging进行回溯分析和查找引入点的能力也是非常宝贵的。 因此,首先保护您的服务器,然后仅在有意义的情况下使用encryption来保护源代码pipe理中的敏感信息。 只是我2美分。
git-annex提供了Tahoe-LAFS钩子,这可能会比你需要的更为复杂。