加密与安全(git-crypt)

git-crypt - transparent file encryption in git

从 git-crypt 的官方文档中可知:

git-crypt 使用 AES-256 在 CTR 模式下对文件进行加密,并且使用基于文件 SHA-1 HMAC 生成的合成初始化向量(IV)。这种操作模式在确定性选择明文攻击下被证明具有语义安全性,确保除了判断两个文件是否完全相同之外,不会泄露其他任何信息。

git-crypt 是结合了 GPG(GNU Privacy Guard)和 AES 加密技术的一个工具。它允许通过 GPG 公钥/私钥系统来管理和分发加密密钥,从而实现对 Git 仓库中特定文件的安全保护。对于每个需要加密的文件,git-crypt 利用 AES-256 加密算法在 CTR 模式下进行加密,以保证数据安全。

当与他人共享仓库时,可以通过 GPG 公钥为不同的用户提供访问权限,添加 GPG 用户后,会在仓库根目录下的 .git-crypt 文件夹内添加一个 GPG 加密的密钥文件。此外,git-crypt 还支持使用对称密钥的方式,这种方式下,用户需安全地将密钥传达给协作者,不依赖于 GPG。

因此,git-crypt 在实际应用中整合了 GPG 的密钥管理和 AES 加密算法,实现了透明的文件加密与解密功能,使得在版本控制的同时能够保护敏感信息的安全。

也就是说,git-crypt 是一个将 GPG 和 AES 结合的项目,GPG 来管理用户权限,AES 来加密文件

环境配置(Windows)

安装

要把从 git-crypt 下载的 git-crypt-0.7.0-x86_64.exe 重命名为 git-crypt.exe,否则检测不到环境变量

git-crypt.exe 放到 git\bin 目录下

查看环境

gpg --version
gpg (GnuPG) 2.4.3
libgcrypt 1.10.2
Copyright (C) 2023 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: C:\Users\atlas\AppData\Roaming\gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
git --vesion
git version 2.42.0.windows.1
git-crypt --version
git-crypt 0.7.0

git-crypt 使用步骤

  1. git 初始化
git init
  1. 创建 .gitattributes 追踪文件
.gitattributes
  1. .gitattributes 中输入配置:
*.md filter=git-crypt diff=git-crypt

*.xlsx filter=git-crypt diff=git-crypt

*.jpg filter=git-crypt diff=git-crypt

*.png filter=git-crypt diff=git-crypt

# 加密指定文件夹下的md文件
Test/*.md filter=git-crypt diff=git-crypt

# 加密指定文件夹下的所有文件
Test/** filter=git-crypt diff=git-crypt
  1. 提交 .gitattributes 文件
git add .gitattributes
git commit -m add.gitattributes
  1. 生成 gpg 密钥(推荐在 kleopatra 中生成,因为有 GUI)
gpg2 --full-gen-key      < 2.1.17
gpg --full-generate-key  >= 2.1.17
gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
   (9) ECC (sign and encrypt) *default*
  (10) ECC (sign only)
  (14) Existing key from card
Your selection? 1           <--选择密钥类型
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)         <--选择密钥长度,在 1024到4096 之间,默认为 3072
Requested keysize is 3072 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days    <-- <n>  = 密钥在 n 天后过期
      <n>w = key expires in n weeks   <-- <n>w = 密钥在 n 周后过期
      <n>m = key expires in n months  <-- <n>m = 密钥在 n 月后过期
      <n>y = key expires in n years   <-- <n>y = 密钥在 n 年后过期
Key is valid for? (0)     <--选择密钥有效期
Key does not expire at all
Is this correct? (y/N)   <--确认

GnuPG needs to construct a user ID to identify your key.

Real name: YOUR_NAME      <--输入密钥名称
Email address: test@test.com       <--输入密钥邮箱
Comment: test          <--输入密钥注释
You are using the 'utf-8' character set.
You selected this USER-ID:
    "YOUR_NAME (test) <test@test.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o  <--最终确认,如果你想修改密钥名称则输入 n,以此类推,最终确认则输入 o
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.    <--这一步输入密钥密码
gpg: revocation certificate stored as 'C:\\Users\\user\\AppData\\Roaming\\gnupg\\openpgp-revocs.d\\095A4F5A6125D5EB02FE5CB824B8F8F7EAFFD84D.rev'
public and secret key created and signed.

pub   rsa3072 2024-02-25 [SC]
      095A4F5A6125D5EB02FE5CB824B8F8F7EAFFD84D
uid                      YOUR_NAME (test) <test@test.com>
sub   rsa3072 2024-02-25 [E]
  1. git-crypt 初始化
git-crypt init
  1. 把第五步生成的密钥导入仓库
git-crypt add-gpg-user <gpg pub uid>
  1. 正常提交文件
git add .
git commit -m "all file"
  1. 本地加密
git-crypt lock

解密

git-crypt unlock

.gitattributes 文件配置解释:

*.md filter=git-crypt diff=git-crypt

*.xlsx filter=git-crypt diff=git-crypt

*.jpg filter=git-crypt diff=git-crypt

*.png filter=git-crypt diff=git-crypt

# 加密指定文件夹下的 md 文件
Test/*.md filter=git-crypt diff=git-crypt

意思是 .md .xlsx .jpg .png 文件是被加密文件

git-crypt status  //查看加密情况
$ git-crypt status
not encrypted: .gitattributes
    encrypted: secretfile

这表示 secretfile 被加密,而 .gitattributes 没有被加密。

推荐阅读:

GPG 密钥生成 | Gitee

GPG入门教程 - 阮一峰的网络日志

git-crypt

讨论

若阁下有独到的见解或新颖的想法,诚邀您在文章下方留言,与大家共同探讨。



反馈交流

其他渠道

版权声明