Git记录伪造

参考文章:

用 Git 這麼久了,你知道 commit 是可以偽造的嗎

为什么Github允许冒充别人的身份Commit?

Git的committer是个可零成本假造的字符串,理论上任何人都可以通过这个来伪造git的历史提交记录。

Git的commit记录包含了名字、邮箱和时间戳。一般情况下,第一次生成的commit,author和committer是同一个人。也是在一般情况下,如果另一个人用git cherry-pick, git rebase, git commit –amend, git filter-branch, git format-patch && git am之类的git命令重写了这个commit,其实都是新生成了一个commit,那么新生成的那个commit的author还是原来的,但committer会变成执行这个操作的用户的名字和邮箱。可以简单地理解成author是第一作者,committer是生成commit的人,这2个角色可能是同一个人也可能是不同的人。

但Git是通过gitconfig文件存储的user.name和user.email的值,因此修改此文件即可完成伪造或临时新建一个新身份

1
git -c user.name="XXXXX" -c user.email="[email protected]" commit --amend --no-edit

这样会把最后一个commit的committer伪装成是Linus Torvalds,所以Git的记录伪造可以说是几乎毫无难度。

GPG (GNU Privacy Guard)

GnuPG 是一个用来进行非对称加密(PGP)的免费软件,简称GPG。

先说说什么是非对称加密。传统的加密手段往往是使用同一个密码进行加密和解密。例如你加密时用的密码是“abc”, 则解密时也要使用“abc”才行。这样就存在一个问题,你不能够把一段加密信息发送给你的朋友。试想,如果采用这种加密方式把信息发送给你的朋友时,你的朋友必须要知道你的密码才能把你的信息解密出来。但你如何保证你的朋友是绝对可靠的呢?也就是说,如果你的朋友把你的密码告诉了别人,你的密码就不再安全了(第三方攻击)。

非对称加密采用的是另一种思想。它会给你产生两个密钥,一个称为“公钥”,另一个称为“私钥”。公钥是可以公开的,你尽管把它传给别人;私钥你一定要保管好不让其他任何人知道。当某人得到你的公钥后,他就可以给你发送加密信息了。具体来说,他把他要发给你的信息用你的公钥加密后发给你,加密的信息只能用你的私钥去解密。这样,因为世界上除了你以外没有别人知道你的私钥,所以即使别人看到发送给你的加密信息他也无法解密,甚至连发送者本人也不行,因为他不知道你的私钥。简单说来,就是用公钥去加密,用对应的私钥去解密。想给谁发送加密信息,首先要得到他的公钥。

GPG配置

  1. GPG官网下载安装包
gpg安装包
gpg安装包
  1. 将安装地址配置入系统环境变量
环境变量
环境变量
  1. 于终端输入命令
1
gpg --version
检查环境变量
检查环境变量
  1. 输入命令开始生成
1
gpg --full-generate-key
  1. 配置密匙生成

    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

    选择1,GitHub要求必须是RSA

    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (3072) 4096

    直接回车默认,或输入最大的4096

    Please specify how long the key should be valid.
    0 = key does not expire
    = key expires in n days
    w = key expires in n weeks
    m = key expires in n months
    y = key expires in n years
    Key is valid for? (0) 0

    输入0,选择永不过期

密匙配置
密匙配置
  1. 配置用户身份

    设置密钥的姓名,邮箱,描述,按O确认吗,在弹出框中输入密匙管理密码,极其重要,每次提交都要输入

配置用户身份
配置用户身份
  1. 输入命令,确认生成状态
1
gpg --list-secret-keys --keyid-format=long
生成结果
生成结果
  1. 输出密匙
1
gpg --armor --export 密钥ID
密匙
密匙
  1. 打开GitHub个人页面,选择SSH and GPG keys -> New GPG key , 并粘贴上一步的输出结果
GitHub GPG
GitHub GPG
  1. 本地Git配置gpg路径
1
git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
  1. 查看GPG密匙ID并复制
1
gpg --list-secret-keys --keyid-format=long
查看GPG密匙ID
查看GPG密匙ID
  1. Git设置GPG签名密匙
1
git config --global user.signingkey 684B42074D2D6B09
  1. Git设置提交时需要GPG签名
1
git config --global commit.gpgsign true
  1. 代码提交时输入密匙管理密码
输入密匙管理密码
输入密匙管理密码
  1. GitHub提交记录出现verified标记,证明提交通过GPG认证
GitHub verified
GitHub verified