在之前的 使用Git-Crypt和GPG加密Git代码库中的敏感信息(一)介绍了git-crypt的一般用法,通过分发密匙达到加解密仓库中敏感数据的目的,但通过分发密钥,容易造成密钥泄露,实际应用中会结合GPG的公私钥来来分发Git-Crypt 加解密仓库敏感信息的权限 ,如果对GPG不了解可以阅读GPG加密与数字签名以及在Git 中使用GPG签名提交 了解一下GPG的基本用法。
git-crypt 添加GPG公钥用户
GPG 的私钥和公钥其实代表了拥有这个GPG公私钥的用户的身份,可以通过使用git-crypt命令添加GPG 公钥用户到使用git-crypt加密敏感数据的git 代码仓库,从而让此GPG 公钥用户有git-crypt unlock的权限,具体操作使用如下命令。
首先获取当前机器的GPG 公钥列表
PS C:\Users\David> gpg --list-keys --keyid-format=long
[keyboxd]
---------
pub rsa1024/B26A154E6EE71E72 2024-02-20 [SC] [expires: 2034-02-17]
96964DABF5A3A10BE371FB34B26A154E6EE71E72
uid [ultimate] David Wang <davidwang@gmail.com>
sub rsa1024/C1305211C9667A9E 2024-02-20 [E] [expires: 2034-02-17]
然后在代码从仓库根目录运行如下命令
git-crypt add-gpg-user B26A154E6EE71E72
这个命令会在根目录下创建一个使用keyid匹配的GPG 公钥加密git-crypt init产生的用于加解密代码仓库敏感信息的对等密匙产生的文件。这里有两层密钥,第一层是git-crypt init产生的密钥,这是一个对等密匙,用于加解密仓库敏感信息,第二层密钥是GPG 公钥,上面的命令使用GPG公钥加密第一层git-crypt init命令产生的密钥,将加密后的密钥内容保存成文件。效果如下图所示。
这样,下次使用git-crypt unlock 解密的时候,就不用传密钥文件参数给git-crypt unlock命令了,git-crypt 会自动遍历根目录下.git-crypt目录下的密钥文件,并尝试比对看本机有没有安装相对应的GPG私钥来解密这个.git-crypt目录下的密钥文件以获得GPG公钥加密后的git-crypt的对等加密密钥,如果本机有对应GPG私钥可以解密,然后就使用GPG私钥解密加密后的密钥文件获取git-crypt 密钥,然后使用git-crypt密钥加解密代码仓库中的加密过的敏感信息文件。如下所示。
先测试加密
在测试解密
输入私钥密码后
可以看到通过添加GPG user之后使用git-crypt unlock命令之后,不用传密钥文件参数来解密了。
git-crypt 添加新GPG公钥用户
通过这样的方式如果想要别人也有使用git-crypt 加解密仓库中的敏感信息,就可以让别人发送他的GPG公钥给你,然后你把对方的公钥导入到你机器上,然后通过git-crypt add-gpg-user 来使用它的gpg文件来加密git-crypt 密钥并在.git-crypt 文件生成一个加密密钥文件并提交push到远程代码仓库,这样别人在本地重新拉取代码后就也可以使用git unlock命令解密代码库中的敏感信息了,因为.git-crypt目录下包含了使用它的gpg 加密git-crypt密钥生成的加密密钥文件,而它本机装有自己的GPG私钥,所以git-crypt unlock 的时候就可以使用它自己的gpg 解密加密密钥文件获取git-crypt 密钥然后解密仓库敏感信息了,具体操作步骤如下。
导入别人GPG公钥
PS D:\projects\ecpcb\galaxy-core> gpg --import .\davidpub2.asc
gpg: key 9C796163E291AF14: public key "david.wang <davidwang@gmail.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
PS D:\projects\ecpcb\galaxy-core>
此时再看本机GPG 公钥列表
PS D:\projects\ecpcb\galaxy-core> gpg --list-keys --keyid-format long
[keyboxd]
---------
pub rsa1024/B26A154E6EE71E72 2024-02-20 [SC] [expires: 2034-02-17]
96964DABF5A3A10BE371FB34B26A154E6EE71E72
uid [ultimate] David Wang <davidwangqing@live.com>
sub rsa1024/C1305211C9667A9E 2024-02-20 [E] [expires: 2034-02-17]
pub rsa2048/9C796163E291AF14 2024-03-04 [SC]
F49C56FF5264AB5CF5F6A3E09C796163E291AF14
uid [ unknown] david.wang <davidwang@gmail.com>
sub rsa2048/7793195898DF2C11 2024-03-04 [E]
PS D:\projects\ecpcb\galaxy-core>
设置你对导入的GPG公钥的信任级别到ultimately , 不然git-crypt 添加GPG公钥用户会报错
PS D:\projects\ecpcb\galaxy-core> gpg --edit-key 9C796163E291AF14
gpg (GnuPG) 2.4.4; Copyright (C) 2024 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.
pub rsa2048/9C796163E291AF14
created: 2024-03-04 expires: never usage: SC
trust: full validity: unknown
sub rsa2048/7793195898DF2C11
created: 2024-03-04 expires: never usage: E
[ unknown] (1). david.wang <davidwang@gmail.com>
gpg> trust
pub rsa2048/9C796163E291AF14
created: 2024-03-04 expires: never usage: SC
trust: full validity: unknown
sub rsa2048/7793195898DF2C11
created: 2024-03-04 expires: never usage: E
[ unknown] (1). david.wang <davidwang@gmail.com>
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)
1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu
Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y
pub rsa2048/9C796163E291AF14
created: 2024-03-04 expires: never usage: SC
trust: ultimate validity: unknown
sub rsa2048/7793195898DF2C11
created: 2024-03-04 expires: never usage: E
[ unknown] (1). david.wang <davidwang@gmail.com>
Please note that the shown key validity is not necessarily correct
unless you restart the program.
gpg> quit
然后添加这个GPG 公钥用户到代码仓库
PS D:\projects\ecpcb\galaxy-core> git-crypt add-gpg-user 9C796163E291AF14
[feature/gitcrypt 4718ae8] Add 1 git-crypt collaborator
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 .git-crypt/keys/default/0/F49C56FF5264AB5CF5F6A3E09C796163E291AF14.gpg
PS D:\projects\ecpcb\galaxy-core>
添加后会在代码仓库根目录的.git-crypt目录下产生一个新的用GPG公钥加密git-crypt密钥的加密密钥文件。
提交代码到远程仓库之后,持有GPG公钥的用户就可以使用git-crypt unlock解密敏感信息了。
总之,通过GPG公钥来授权用户加解密仓库敏感信息的做法比发送git-crypt共享密钥文件的方式要安全很多,新的GPG公钥用户的添加必须有老的已经拥有仓库敏感信息加解密权限的人来添加,也就是由.git-crypt目录下所列举的 keyid(文件的名字就是GPG 的keyid) 的GPG 公钥拥有者来添加。
相关文章: