
# 在Git客户端使用git-crypt传输敏感数据
#### git-crypt简介
git-crypt是一款第三方开源软件，可以用于对Git仓库中的文件进行透明化的加密和解密。git-crypt可对指定文件、指定文件类型等进行加密存储。开发者可以将加密文件（如机密信息或敏感数据）与可共享的代码存储在同一个仓库中，并且该仓库可以同普通仓库一样被拉取和推送，只有持对应文件密钥的人才能查看到加密文件的内容，但不会限制参与者对非加密文件读写。
 #### 在Windows中使用密钥对方式进行加密、解密
1. [下载并安装最新的Windows Git客户端](https://git-scm.com/download/win)，下载[最新基于Windows的git-crypt](https://github.com/oholovko/git-crypt-windows/releases)，把下载到的exe文件放到Git安装目录下的"cmd"文件夹中。
2. 执行如下命令，在本地生成密钥对。 
   1. 打开"Git Bash"，并进入本地代码仓库。
   
   2. 执行如下命令，在Git代码仓库中创建".git-crypt"文件夹，文件夹包含加密文件所需的密钥和配置文件。
      ```
      git-crypt init
      ```
      
   
   3. 执行如下命令，把密钥文件导出到C:/test目录并命名为KeyFile。
      ```
      git-crypt export-key /c/test/keyfile
      ```
      
   
   4. 执行完上述步骤，用户可以到密钥导出的文件路径进行验证，确认是否已成功生成密钥。持有这个密钥文件的计算机，可以解密对应的加密文件。
   
   
   
   
3. 执行如下命令，为代码仓库配置加密范围。 
   1. 在仓库的根目录下新建一个名为".gitattributes"的文件。
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/public_sys-resources/warning_3.0-zh-cn.png)
      - 如果创建.gitattributes文件时提示"必须键入文件名"，可以将文件名填写成 ".gitattributes."即可创建成功，如果使用Linux指令创建文件，则不会出现此问题。
      
      - 注意不要将.gitattributes保存为txt文件，否则配置会无效。
        
   
   2. 打开".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 文件夹下的文件加密
      ```
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275757.png "点击放大")
      
   
   
   
   
4. **进行文件加密** 。
   
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/public_sys-resources/warning_3.0-zh-cn.png)
   "git-crypt status"只会加密本次待提交的文件，对本次未发生修改的历史文件不会产生加密作用，Git会对此设定涉及的未加密文件做出提示（见下图中的Warning），如果想将仓库中的对应类型文件全部加密，请使用"git-crypt status -f"，-f （强制执行）具有一定的风险，请谨慎使用。
   在仓库根目录打开Git bash，执行如下指令即可完成加密，加密后可看到目前文件的加密状态。
   ```
   git-crypt status
   ```
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275777.png "点击放大")
   加密执行后，在用户的本地仓库仍能明文方式打开和编辑这些加密文件，这是因为用户本地仓库有密钥存在。
   这时用户可以使用add 、commit、push组合将仓库推送到代码托管仓库，此时加密文件将一同被推送。
   加密文件在代码托管仓库中将以加密二进制方式存储，无法直接查看。如果没有密钥，就算将其下载到本地，也无法解密。
   
   
5. **进行文件解密** 。
   
   1. 确认本机器Git安装路径下存在git-crypt文件。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195865.png)
      
   
   2. 将仓库从代码托管克隆到本地。
   
   3. 获取加密此仓库的密钥文件，并存储于本地计算机。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195877.png "点击放大")
      
   
   4. 进入仓库目录，右键打开Git bash。
   
   5. 执行解密指令，执行后无回显，则为执行成功。
      ```
      git-crypt unlock /C/test/KeyFile     #请将 /C/test/KeyFile 更换为用户实际的密钥存储路径
      ```
      
   
   
   
   
 
 #### 在Windows中使用GPG方式进行加密、解密
1. 安装并初始化Git。
2. 下载最新基于[Windows的git-crypt](https://github.com/oholovko/git-crypt-windows/releases)，将下载到的exe文件放到Git安装目录下的"cmd"文件夹中，下图以"Windows Server 2012 R2 标准版 64"的默认Git Bash安装路径为例。
   
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216315920.png)
   
   
3. [下载GPG](https://www.gnupg.org/download/)最新版本，当提示用户捐赠此开源软件时，选"0"，即可跳过捐赠环节。
   
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216156108.png "点击放大")
   双击进行安装，单击"下一步"，即可完成安装。
   
   
4. **使用GPG方式生成密钥对** 。
   
   1. 任意位置打开Git Bash，执行如下指令。
      ```
      GPG --gen-key
      ```
      
   
   2. 根据提示，输入名称、邮箱。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216156104.png "点击放大")
      
   
   3. 确认无误后，按提示输入 "o"，并回车，此时会弹出输入密码窗口和确认密码窗口。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275745.png "点击放大")
      密码可以为空，出于信息安全考虑，建议设置新的密码。
      
   
   4. 显示如下图返回内容，则为GPG密钥对生成成功。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195901.png)
      
   
   
   
   
5. **进行仓库加密初始化设置** 。
   
   1. 仓库根目录打开Git bash，执行如下指令进行初始化。
      ```
      git-crypt init
      ```
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195873.png "点击放大")
      
   
   2. 将密钥副本添加到用户的仓库，该副本已使用用户的公共GPG密钥加密，指令如下。
      ```
      git-crypt add-GPG-user USER_ID
      ```
      此处的"USER_ID"可以是生成此密钥时的名称（①）、邮箱（②）或指纹（③）这三种是可以唯一标识此密钥的凭证。
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195893.png "点击放大")
      执行后会提示用户创建了.git-crypt文件夹以及其中的两个文件。
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275781.png "点击放大")
      
   
   
   
   
6. **为仓库配置加密范围** 。
   
   1. 进入仓库下的.git-crypt文件夹。
   
   2. 打开.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 文件夹下的文件加密
      ```
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195861.png "点击放大")
      
   
   3. 将.gitattributes文件复制到仓库的根目录下。
   
   
   
   
7. **进行文件加密** 。
   
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/public_sys-resources/warning_3.0-zh-cn.png)
   "git-crypt status"只会加密本次待提交的文件，对本次未发生修改的历史文件不会产生加密作用，Git会对此设定涉及的未加密文件做出提示（见下图中的Warning），如果想将仓库中的对应类型文件全部加密，请使用"git-crypt status -f"，-f （强制执行）具有一定的风险，可能会对合作伙伴的工作产生不便，请谨慎使用。
   仓库根目录打开Git bash，执行如下指令即可完成加密，并会看到目前文件的加密状态。
   ```
   git-crypt status
   ```
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275761.png "点击放大")
   加密执行后，在用户的本地仓库仍能明文方式打开和编辑这些加密文件，这是因为用户本地仓库有密钥存在。
   这时用户可以使用add 、commit、push组合将仓库推送到代码托管仓库，此时加密文件将一同被推送。
   加密文件在代码托管仓库中将以加密二进制方式存储，无法直接查看。如果没有密钥，就算将其下载到本地，也无法解密。
   
   
8. **将密钥导出** 。
   
   1. 列出当前可见密钥，可以看到每个密钥的名称、邮箱、指纹信息。
      ```
      GPG --list-keys
      ```
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216315924.png "点击放大")
      
   
   2. 使用GPG --export-secret-key指令导出密钥，本示例中将名称为"GPGTest"的密钥导出到"C盘"，并命名为"Key"。
      ```
      GPG --export-secret-key -a GPGTest > /c/key
      ```
      执行时会提示用户输入此次密码，正确输入即可。
      执行后无回显，到对应目录（本示例中为C盘）可看到密钥文件。
      
   
   3. 将生成的密钥发送给团队内需要共享秘密文件的伙伴。
   
   
   
   
9. **将密钥导入** **并解密文件** 。
   
   1. 想要在另一台机器解密文件，首先也需要基于Git，下载安装git-crypt、GPG。
   
   2. 将对应仓库Clone到本地。
   
   3. 取得对应加密文件的密钥，密钥的导出请参见[步骤8]，本示例中将取得的密钥放在C盘。
   
   4. 进入仓库，打开Git Bash使用import指令导入密钥。导入时会提示用户输入密钥的密码。
      ```
      GPG --import  /c/key
      ```
      
   
   5. 使用unlock指令，解密文件。
      ```
      git-crypt unlock
      ```
      解锁时会弹窗提示用户输入此密钥的密码，正确输入后无回显，则为解锁成功。
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275749.png "点击放大")
      
   
   
   
   
10. 解密完成后，查看文件可以看到文件内容已经不是加密状态。
 
#### 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。 [下载源码](https://github.com/AGWA/git-crypt)
  ```
  make
  make install
  ```
  安装到指定目录。
  ```
  make install PREFIX=/usr/local
  ```
  
- Linux环境下，使用源码编译方式安装GPG。 [下载源码](https://www.gnupg.org/download/index.html)
  ```
  ./configure
  make
  make install
  ```
  
- 使用Debian包安装git-crypt。 [下载源码](https://github.com/AGWA/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
- macOS上安装git-crypt。 使用 brew 软件包管理器，只需运行如下命令。
  ```
  brew install git-crypt
  ```
  
- macOS上安装GPG。 使用 brew 软件包管理器，只需运行如下命令。
  ```
  brew install GPG
  ```
  
 
