在Git客户端使用git-crypt传输敏感数据
git-crypt简介
git-crypt是一款第三方开源软件,可以用于对Git仓库中的文件进行透明化的加密和解密。git-crypt可对指定文件、指定文件类型等进行加密存储。开发者可以将加密文件(如机密信息或敏感数据)与可共享的代码存储在同一个仓库中,并且该仓库可以同普通仓库一样被拉取和推送,只有持对应文件密钥的人才能查看到加密文件的内容,但不会限制参与者对非加密文件读写。
在Windows中使用密钥对方式进行加密、解密
- 下载并安装最新的Windows Git客户端,下载最新基于Windows的git-crypt,把下载到的exe文件放到Git安装目录下的“cmd”文件夹中。
- 执行如下命令,在本地生成密钥对。
- 打开“Git Bash”,并进入本地代码仓库。
- 执行如下命令,在Git代码仓库中创建“.git-crypt”文件夹,文件夹包含加密文件所需的密钥和配置文件。
git-crypt init
- 执行如下命令,把密钥文件导出到C:/test目录并命名为KeyFile。
git-crypt export-key /c/test/keyfile
- 执行完上述步骤,您可以到密钥导出的文件路径进行验证,确认是否已成功生成密钥。持有这个密钥文件的计算机,可以解密对应的加密文件。
- 执行如下命令,为代码仓库配置加密范围。
- 在仓库的根目录下新建一个名为“.gitattributes”的文件。
- 打开“.gitattributes”文件,设置加密范围,语法如下。
文件名或文件范围 filter=git-crypt diff=git-crypt
下面给出四个示例。FT/file01.txt filter=git-crypt diff=git-crypt #将特定文件加密,这里加密的是FT文件夹下的file01.txt *.java filter=git-crypt diff=git-crypt #将 .java类型文件加密 G* filter=git-crypt diff=git-crypt #将 文件名为 G 开头的文件加密 ForTest/** filter=git-crypt diff=git-crypt #将 ForTest 文件夹下的文件加密
- 如果创建.gitattributes文件时提示“必须键入文件名”,可以将文件名填写成 “.gitattributes.”即可创建成功,如果使用Linux指令创建文件,则不会出现此问题。
- 注意不要将.gitattributes保存成txt文件,否则配置会无效。
- 进行文件加密。
在仓库根目录打开Git bash,执行如下指令即可完成加密,加密后可看到目前文件的加密状态。
git-crypt status
加密执行后,在您的本地仓库仍能明文方式打开和编辑这些加密文件,这是因为您本地仓库有密钥存在。
这时您可以使用add 、commit、push组合将仓库推送到代码托管仓库,此时加密文件将一同被推送。
加密文件在代码托管仓库中将以加密二进制方式存储,无法直接查看。如果没有密钥,就算将其下载到本地,也无法解密。
“git-crypt status”只会加密本次待提交的文件,对本次未发生修改的历史文件不会产生加密作用,Git会对此设定涉及的未加密文件做出提示(见上图中的Warning),如果想将仓库中的对应类型文件全部加密,请使用“git-crypt status -f”。
在让团队合作中 -f (强制执行)具有一定的风险,请谨慎使用。
- 进行文件解密。
在Windows中使用GPG方式进行加密、解密
- 安装并初始化Git。
- 下载最新基于Windows的git-crypt,将下载到的exe文件放到Git安装目录下的“cmd”文件夹中,下图以“Windows Server 2012 R2 标准版 64”的默认Git Bash安路径为例。
- 下载GPG最新版本,当提示您捐赠此开源软件时,选“0”,即可跳过捐赠环节。
双击进行安装,单击“下一步”,即可完成安装。
- 使用GPG方式生成密钥对。
- 进行仓库加密初始化设置。
- 仓库根目录打开Git bash,执行如下指令进行初始化。
git-crypt init
- 将密钥副本添加到您的仓库,该副本已使用您的公共GPG密钥加密,指令如下。
git-crypt add-GPG-user USER_ID
此处的“USER_ID”可以是生成此密钥时的名称(①)、邮箱(②)或指纹(③)这三种是可以唯一标识此密钥的凭证。
执行后会提示您创建了.git-crypt文件夹以及其中的两个文件。
- 仓库根目录打开Git bash,执行如下指令进行初始化。
- 为仓库配置加密范围。
- 进入仓库下的.git-crypt文件夹。
- 打开.gitattributes文件,设置加密范围,语法如下。
文件名或文件范围 filter=git-crypt diff=git-crypt
下面给出四个示例。FT/file01.txt filter=git-crypt diff=git-crypt #将 特定文件加密,这里加密的是FT文件夹下的file01.txt *.java filter=git-crypt diff=git-crypt #将 .java类型文件加密 G* filter=git-crypt diff=git-crypt #将 文件名为 G 开头的文件加密 ForTest/** filter=git-crypt diff=git-crypt #将 ForTest 文件夹下的文件加密
- 将.gitattributes文件复制到仓库的根目录下。
- 进行文件加密。
仓库根目录打开Git bash,执行如下指令即可完成加密,并会看到目前文件的加密状态。
git-crypt status
加密执行后,在您的本地仓库仍能明文方式打开和编辑这些加密文件,这是因为您本地仓库有密钥存在。
这时您可以使用add 、commit、push组合将仓库推送到代码托管仓库,此时加密文件将一同被推送。
加密文件在代码托管仓库中将以加密二进制方式存储,无法直接查看。如果没有密钥,就算将其下载到本地,也无法解密。
“git-crypt status”只会加密本次待提交的文件,对本次未发生修改的历史文件不会产生加密作用,Git会对此设定涉及的未加密文件做出提示(见上图中的Warning),如果想将仓库中的对应类型文件全部加密,请使用“git-crypt status -f”。
在让团队合作中 -f (强制执行)具有一定的风险,可能会对合作伙伴的工作产生不变,请谨慎使用。
- 将密钥导出。
- 列出当前可见密钥,可以看到每个密钥的名称、邮箱、指纹信息。
GPG --list-keys
- 使用GPG --export-secret-key指令导出密钥,本示例中将名称为“GPGTest”的密钥导出到“C盘”,并命名为“Key”。
GPG --export-secret-key -a GPGTest > /c/key
执行时会提示您输入此次密码,正确输入即可。
执行后无回显,到对应目录(本示例中为C盘)可看到密钥文件。
- 将生成的密钥发送给团队内需要共享秘密文件的伙伴。
- 列出当前可见密钥,可以看到每个密钥的名称、邮箱、指纹信息。
- 将密钥导入并解密文件。
- 想要在另一台机器解密文件,首先也需要基于Git,下载安装git-crypt、GPG。
- 将对应仓库Clone到本地。
- 取得对应加密文件的密钥,密钥的导出请参见步骤8,本示例中将取得的密钥放在C盘。
- 进入仓库,打开Git Bash使用import指令导入密钥。导入时会提示您输入密钥的密码。
GPG --import /c/key
- 使用unlock指令,解密文件。
git-crypt unlock
解锁时会弹窗提示您输入此密钥的密码,正确输入后无回显,则为解锁成功。
- 解密完成后,查看文件可以看到文件内容已经不是加密状态。
git-crypt加密在团队合作中的应用
很多时候,团队需要在代码仓库中存储限制公开的文件,这时可以优先考虑使用“CodeArts Repo” + “Git” + “git-crypt”的组合,来实现部分文件在仓库分布式开源中的加密。
通常,直接使用密钥对方式的加密就能满足限制部分文件访问的需要。
当团队需要将加密文件设置不同的秘密级别时,可以使用GPG方式加密,这种方式支持您对同一个仓库的不同文件使用不同的密钥加密,将不同密级的密钥分别随仓库共享给组织内的伙伴,即可实现文件的定向分级限制访问。
Linux、Mac平台的git-crypt、GPG安装
Linux平台安装git-crypt、GPG
- Linux安装依赖环境。
Software
Debian/Ubuntu package
RHEL/CentOS package
Make
make
make
A C++11 compiler (e.g. gcc 4.9+)
g++
gcc-c++
OpenSSL development files
libssl-dev
openssl-devel
- Linux环境下,使用源码编译方式安装git-crypt。
make make install
安装到指定目录。
make install PREFIX=/usr/local
- Linux环境下,使用源码编译方式安装GPG。
./configure make make install
- 使用Debian包安装git-crypt。
Debian打包可以在项目Git仓库的“debian”分支中找到。
软件包是用“git-buildpackage”构建的,如下所示。
git checkout debian git-buildpackage -uc -us
- Debian环境下使用构建包安装GPG。
sudo apt-get install gnupg
MAC平台安装git-crypt、GPG