签名你的每个 Git Commit入门基础_git使用帮助

好久没有写代码提交 GitHub 了,真是惭愧!回到正题,今天提交了一个代码,冷不丁发现,在我的 Commit 记录里面,有一条被打上了 Verified 标记。原来 GitHub 的 Commit 支持签名验证了,我可以对每一个我的 Commit 进行签名(Commit Signature),这样,GitHub 的其他用户就知道这个“提交”来自一个可以信任

签名你的每个 Git Commit入门基础

好久没有写代码提交 GitHub 了,真是惭愧!回到正题,今天提交了一个代码,冷不丁发现,在我的 Commit 记录里面,有一条被打上了 Verified 标记。原来 GitHub 的 Commit 支持签名验证了,我可以对每一个我的 Commit 进行签名(Commit Signature),这样,GitHub 的其他用户就知道这个“提交”来自一个可以信任的来源。我举个例子,如果有人设定了我的头像,我的名字,往我的版本库里 Push 了一个 Commit(我的 WordPress 插件官方仓库,被黑客提交过恶意代码,因为我不小心被钓鱼了,自爆一下黑历史),那么,有没有 Verified 就成为一个识别真伪的依据(虽然,我位微言轻,可能不太会有人假冒我,我也知道,杠头请退散)。

签名你的每个 Git Commit入门基础_git使用帮助

给每个 Commit 签名

作为个人开发者,给自己的每个 Commit 签名,可能有点多此一举(或许会有这么想的人),但是在一个多人合作开发的项目里,管理员可以要求所有的项目成员,都必须签名自己的 Commit,不接受未经签名的 PR,那就产生了一定的意义(虽然是什么意义我还没想得太明白)。

上面图里个 Verified 标记,是 GitHub 自动给打上的,因为一个项目的第一个 Commit 是在我生成项目的时候,由 GitHub 的 Web 站点自动提交的,是项目的初始化 Commit。这种情况由 GitHub 方面利用你在网站可信的登录态进行签名。但是我们知道,这是一个分布式版本控制,一般来说,Commit 都是在本地完成的,然后 Push 到云端,所以,要想让每个 Commit 都能够带有签名验证,需要在本地部署签名的过程。怎么做呢?

在 GitHub 验证一个邮箱

我们在 git 里面,进行 commit 操作的时候,都需要设定一个 user.name 和 user.email,所以,对 commit 的签名,是基于 email 的。第一个步骤就是在 GitHub 的 Settings 里面,设置一个用于关联签名算法的 email。你可能已经有了多个 email,在本地,需要设置那个关联了 GPG 签名的 email 来提交代码。

生成一个 GPG 的 key

刚才已经说了,签名的原理是使用 GPG,其实 GitHub 还支持 S/MIME,我不知道那是什么,所以就选 GPG了。

GitHub 支持的加密算法有:

  • RSA
  • ElGamal
  • DSA
  • ECDH
  • ECDSA
  • EdDSA

如果加密算法不在上述之中,可能无法被 GitHub 所验证。如果,你的环境没有安装 GPG,第一步你可能需要安装一下:

brew install gpg2 # 我的环境是 Mac 就用 Homebrew 安装了

我在 Mac 上安装的是 GPG 2.x,其实有 GPG 1.x 和 2.x 两个版本,显然大一点的更新一些,支持了很多新功能,不过,有可能你所在的系统环境只能选择 1.x。2.1.17 版本以上的可以使用如下命令来生成 key:

gpg --full-generate-key

虽然官方说了支持上面 6 种算法,但是在 GPG 指南这里说,必须选择 RSA,我不知道这个矛盾是为什么,以后再来探究。上面的命令会开启一个命令行交互式创建 key pair 的过程,问及算法的时候,用默认的就行了,我用的 GnuPG 2.2.19,默认选项是 RSA and RSA。当问到 key 的长度的时候,要填写 4096,因为官方指南要求这样,而 GnuPG 的默认值是 2048,这里需要注意。

接下来是过期时间,个人使用选择 does not expire,永不过期就可以了。如果是团队使用,看整个团队的安全策略如何。

接下来要求填写 ID 相关信息,会填写名字,邮箱,注释,这里邮箱是比较关键的,在第 1 步里,咱们预先准备了要关联的邮箱地址。就填上那个。然后是要求键入密码。这个密码的用途是保护你的私钥。如果你自信不会有人入侵你的个人电脑,那么你可以不填写密码,GnuPG 会很贴(fan)心(ren)地走两遍这个要求密码保护的过程,请耐心回车。(注:假如很不幸,一个黑客已经黑到你个人电脑了,用你的身份打开了你的 Term,这时候,如果你的私钥是有密码保护的,每当程序需要使用你的私钥的时候,都必须输入密码,这个情况下,私钥保护密码就是最后一道屏障。)

gpg --list-secret-keys --keyid-format LONG
/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid                          Hubot (Comment) <Hubot@a.com>
ssb   4096R/42B317FD4BA89E7A 2016-03-10

使用上述命令就可以查看你 LONG 格式的私钥了。这个私钥就是要用来对你的每个 Commit 进行签名的。

在 GitHub 登记你的公钥

然后,咱们需要在命令行打印出来自己的公钥,使用如下命令:

gpg --armor --export 3AA5C34371567BD2
# Prints the GPG key ID, in ASCII armor format

-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBF5bciABEADJ/FQa+ymIuKuZycgtPmLMPHEwOtYY21k7zU9ddDZH6ZGIxeN0
N9ljc6zp8/3cQDRrbrirHv/9WqaqSRb+EFcUog5LOfR/C6NeiGNW8AgUuFxGGFXK
s6VrAmzhIxDmKDkRdX9sHf7myiwBhtkFM0/8AGUdR8pjHKw+vA8IJzMhowWkiX1O
F1ZW81gKUYCLSfkty1HccGr4kFpE6r1R/w18hYH2zcr0dll0ox2LHfSHuuQzamew
hdR7B6S5Xi+EJjv7rujHaRWzLoPXktxUFme9LxdVblp6FD/lP79AkPhqSPAwzee+
ShlO9AScCCbsm8p3/KhmUn2yigbfd0eWvh4wm5HvbTCJ3/SLspMYrsF/VMHAJFRW
pmULevI5bdVR3fm7t/IgkjFasmbOZ9EqZNf43ljVi3SOyTmRX9GbxtvHXKL8tgL1
q7do0cArc/cKigEfssHe6gXChLZ6nDEzj/aNgOEcKo/cPVVCH4yzldEMvCB4aMYW
PET+7Io+FM1b69yOtFvKmJnGNpDbtySn1b6E0gWk/3uqzcspAzZMb6aIdZ6BcaXE
wU8zqRqcMXVnI6s2gvrMYrFCUB71ujzdGO9LWIu/y/FOdrzmrjXofOmdQom9Z+dW
cCo7LaTCE994HhLbqacsUROhjFCSzisH1yi0T0rD6oWSzsjFdewpEtjJGwARAQAB
tENDaGFybGVzIChHUEcga2V5IHVzZWQgZm9yIEdpdEh1YiBjb21taXQuKSA8Y2hh
cmxlc3RhbmdAZm94bWFpbC5jb20+iQJOBBMBCAA4FiEE6zd9skJwGmhOg6epkcp5
trRrrvQFAl5bciACGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQkcp5trRr
rvQ…… …… ……
-----END PGP PUBLIC KEY BLOCK-----

大概长上面那个样子的,很长很长,整段拷贝下来,然后去 GitHub 个人的 Settings 界面 SSH and GPG keys 标签里,登记这个公钥。登记完毕后,你能看到这个 key 关联的 email 地址显示出来了。

在 git 里面设定使用签名

咱们的公钥私钥对已经生成了,然后就是需要告诉 git 命令每次 Commit 的时候,都要使用私钥进行签名。

git config --global user.signingkey 3AA5C34371567BD2

上面的命令设定了全局的签名密钥,如果你使用多个身份在多个项目提交代码,那么不要使用 –global 参数,但是,要记得去每个项目里设置单个项目范围的签名私钥。然后,你要告诉 git 命令,以后每次 Commit 都要签名:

git config commit.gpgsign true

也可以手动控制,那么记得执行 git commit 的时候带上 -S 参数。

总结

到此,我们需要的设置已经全部设定完毕了,设定完毕后,执行一个 Commit,然后 Push,就可以在你的项目记录里看到,此次的 Commit 是带有 Verified 标记的了。

此外,有个关于隐私保护的话题。你在 GitHub 验证了一个邮箱,只有你的 Commit 关联了这个验证过的邮箱,在你贡献 PR 的时候,GitHub 才能在贡献人清单里显示出来你的帐号 ID。这也意味着,所有人,都可以看到你的这个电子邮箱,即隐私暴露。

在 GitHub 的 Settings 里面的 Emails 面板,有一个 keep my emails private 的选项,如果勾选了的话,那么关联了你的验证邮箱的 Commit 是无法被 Push 的,因为服务器知道你的隐私设定,会保护你不让你暴露你的私人邮箱。

听起来,如果你非要保护自己的隐私,就死锁了一样。不过,你可以选择,使用 GitHub 提供的匿名 noreply 邮箱,只是一个邮箱地址,并不能收发邮件。你在使用 GPG 进行签名的时候,可以把邮箱地址填成 GitHub 后台给你提供的匿名邮箱。这样,才能同时做到,既签名你的每个 Commit,又在你贡献 PR 的时候,追踪到你的 GitHub 帐号。

文首截图里的项目主页在此: https://github.com/charlestang/trip-table-parser 可以去 commits 标签页里看看带验证的 commit 的效果。

全文完。

海计划公众号
(0)
上一篇 2020/03/22 08:48
下一篇 2020/03/22 08:48

您可能感兴趣的内容

  • 自己动手实现一个axios菜鸟教程网_axios使用帮助

    前言作为一名前端er,对于数据请求的第三方工具axios,一定不会陌生,如果还是有没有用过,或者不了解的小伙伴,这里给你们准备了贴心的中文文档 ,聪明的你们一看就会~唔,为了更好的了解和学习 axios 封装思想和实现原理,我们一起来动手来实现一个简版的 axios ~前期准备工欲善其事,必先利其器,我们在开始我们的项目之前,一定要做好其相关的准备工作,我们

    2020/03/24
  • 小程序多余文本省略号显示小白知识_小程序新手入门

    废话不多说,之前写小程序碰到了一个问题,如何在 wxml 页面中截取数据?1、wxs取数据想必大家都会,不就是 substring 吗?但是这种方法在 wxml 页面中是无效的。那还有 css 啊,不一样可以做到吗?但是个人觉得 css 复用性太差,暂不考虑。实在不行就用 js 呗,在获取到数据后就对数据进行截取。这样好像可以,但数据一多稍微有点复杂,而且一

    2020/03/24
  • vue中计算属性的get与set方法入门指南_属性入门基础教程

    在vue的计算属性中,所定义的都是属性,可以直接调用正常情况下,计算属性中的每一个属性对应的都是一个对象,对象中包括了set方法与get方法computed:{fullNname:{set:function(newValue){console.log(newValue)}get:function(){console.log(this.name)}}
    }而绝大

    2020/03/23
  • 解决vue cli2和cli3打包后不能运行问题 Failed to load resource: net::ERR菜鸟教程网FILENOTFOUND_cli小白攻略

    原因:打包后的文件要在服务器中运行 解决方法:放在服务器中打开,依次在终端执行下面命令npm install http-server -g
    cd dist
    http-server
    另外,本地打开方法:vue cli2 将config文件夹内index.js文件中 build的assetsPublicPath的’/’改为’./’vue cli3 在项目根目录内

    2020/03/22
  • 使用TypeScript两年后-值得吗?小白攻略_TypeScript指南教程

    差不多两年前,我在一个创业团队中开始了一个全新的项目。用到的全都是类似Microservices,docker,react,redux这些时髦的东西。我在前端技术方面积累了一些类似的经验,因为在更早的一年前我带着20多名前端开发人员编写了一个非常大的react应用程序。这对我来说非常具有挑战性。当时我们遇到了很多问题:模型内聚的问题,代码库的增长,复杂且难以

    2020/03/30
  • vue定义全局变量入门基础_变量使用帮助

    VUE.js 中涉及到JS全局变量一、全局变量专用模块得引入全局变量模块 Global.jsconst colorList = [‘violet’,’orange’,’blue’,’darkyellow’,’wheat’,]
    const colorListLength = 5
    export default
    {colorList,colorListLength

    2020/03/30
  • Web安全测试检查单使用说明_安全入门基础知识

    大类细项标记备注上传功能绕过文件上传检查功能P1功能测试阶段覆盖上传文件大小和次数限制P1 注册功能注册请求是否安全传输P1功能测试阶段覆盖注册时密码复杂度是否后台检验P1功能测试阶段覆盖激活链接测试P1功能测试阶段覆盖重复注册P1 批量注册问题P1 登录功能登录请求是否安全传输P1功能测试阶段覆盖会话固定P1功能测试阶段覆盖关键Cookie是否HttpOn

    2020/04/03
  • 懒加载形式,为什么需要懒加载?指南教程_加载基础入门

    懒加载
    按需加载,即一种在页面加载时延迟加载一些非关键资源的技术。
    作为网页内容的一部分图像和影像通常需要消耗很多资源加载。在网页优化的过程中,需要避免资源浪费在加载图片和视频上。这时候就需要用到懒加载,它可以帮助我们减少加载时间和降低负载,而不在内容上偷工减料。
    懒加载形式浏览网站时准备往下拖动滚动条
    拖动图片到视窗
    占位图片被替换成最终图片为什么需要懒加

    2020/03/23
  • JS倒计时指南攻略_时间基础知识教程

    用时间戳来计算倒计时时间戳:当前时间距离1970年1月1日一共过了多少毫秒。得到当前时间以及结束时间的时间戳,二者相减即是剩余的毫秒数,将剩余毫秒数转化成 时 分 秒 即是倒计时。function countDown(Time) {var nowTime = +new Date(); //当前时间的时间戳var inputTime = +new Date(T

    2020/03/24
  • js类型Number、Symbol、Object容易忽略的细节小白攻略_类型基础指南

    NumberNumber 类型表示我们通常意义上的“数字”。这个数 字大致对应数学中的有理数,当然,在计算机中,我们有一定的精度限制。JavaScript 中的 Number 类型有 18437736874454810627(即 2^64-2^53+3) 个值。JavaScript 中的 Number 类型基本符合 IEEE 754-2008 规定的双精度浮

    2020/03/24
  • CSRF绕过后端Referer校验入门教程_csrf小白常识

    CSRF绕过后端Referer校验分正常情况和不正常的情况,我们这里主要讨论开发在写校验referer程序时,不正常的情况下怎么进行绕过。正常情况正常的情况指服务器端校验Referer的代码没毛病,那么意味着前端是无法绕过的。我之前考虑过的方案:JS修改Referer,失败;请求恶意网页后,后端重新送包,问题是你怎么跨域拿Cookie,失败;不正常的情况不正

    2020/03/20
  • H5移动端点击出现背景蓝色框的解决方案使用教程_背景菜鸟教程下载

    当我们在移动端给元素添加点击事件时我们会发现点击时元素会默认出现一个背景色框或者高亮显示 ,如何去掉蓝色边框?安卓这一句是用来解决在安卓上的点击出现篮框问题body{ -webkit-tap-highlight-color:rgba(0,0,0,0);
    }IOS下面是解决ios上去除微信点击蓝色边框a:focus,input:focus,p:focus,d

    2020/03/26
  • vuex小白常识_一个专门为 Vue.js 应用所设计的集中式状态管理架构

    vuex小白常识 官方网址:http://vuex.vuejs.org/ GitHub:https://github.com/vuejs/vuex 简介描述:一个专门为 Vue.j…

    2020/03/06
  • TypeScript映射类型和更好的字面量类型推断入门知识_字面量菜鸟教程下载

    TypeScript 2.1 引入了映射类型,这是对类型系统的一个强大的补充。本质上,映射类型允许w咱们通过映射属性类型从现有类型创建新类型。根据咱们指定的规则转换现有类型的每个属性。转换后的属性组成新的类型。使用映射类型,可以捕获类型系统中类似 Object.freeze() 等方法的效果。冻结对象后,就不能再添加、更改或删除其中的属性。来看看如何在不使用

    2020/03/23
  • 云路课堂入门指南专业的职业技能学习平台,免费课程很多

    云路课堂小白攻略 官方网址:http://www.yun.lu/student/homepage 简介描述:专业的职业技能学习平台,免费课程很多

    2020/03/06
  • Flutter设置背景图片入门百科_背景零基础入门

    前言在我们平时的开发中会经常使用到背景图片,下面我这介绍的是Container通过BoxDecoration来设置的布局1、创建路由子页面Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(“优选访客订阅功能”),),body: buildBody())

    2020/03/24