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
使用步骤
- git 初始化
git init
- 创建
.gitattributes
追踪文件
.gitattributes
- 在
.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
- 提交
.gitattributes
文件
git add .gitattributes
git commit -m add.gitattributes
- 生成
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]
git-crypt
初始化
git-crypt init
- 把第五步生成的密钥导入仓库
git-crypt add-gpg-user <gpg pub uid>
- 正常提交文件
git add .
git commit -m "all file"
- 本地加密
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
没有被加密。
推荐阅读:
讨论
若阁下有独到的见解或新颖的想法,诚邀您在文章下方留言,与大家共同探讨。
反馈交流
其他渠道
版权声明
版权声明:所有 PKMer 文章如果需要转载,请附上原文出处链接。