源代码管理

源代码管理是一件很重要的事情,特别是在进行一项大工程或者是多人合作的时候。当然,工具我还是推荐使用Git来进行管理。

Git

说到Git,很多人第一个反应就是GayHubGitHub,其实Git和GitHub是两个东西,Git是个开源的版本控制软件。

相传Linus最初使用BitKeeper的版本控制软件来管理Linux的代码,但是由于开源社区的用户违反了BitKeeper公司的协议,BitKeeper公司不再免费提供源代码管理服务了。因此Linus决定自己动手,肝一个源代码管理软件,他也写了一些代码。但是大神还是太忙了,写了一些基本的代码之后,就停下来了,说自己对merge的代码不是很熟悉,Linus发了很多邮件,描述自己理想汇总的merge功能应该是什么样子的,要是开源社区的童鞋能够帮忙用脚本实现一下就太好啦。

社区里的小伙伴都不上钩,过了一个星期,一直关注邮件列表的日本青年滨野纯因为上一个项目结束了,新的项目还没有来,就动手实现了这个merge算法,还很详细的写了将近30个测试用例,以及各种分支应该怎么处理的表格。结果,几个小时之后,Linus提交到master分支的东西竟然不是滨野纯写的。据说是Linus想到了更好的实现方法,就这么写了。日本小伙看了之后,发表感叹:“确实就像哥伦布的鸡蛋一样——足以让我那些依照Linus以前的逻辑所写的代码毫无价值——就是优雅到这种程度”。由此可见Linus大神的代码功底深厚,诸君共勉,希望能达到Linus大神这样的高度。

滨野纯也是Git的主要开发人员之一,目前供职于谷歌。值得思考的一点在于他竟然有项目与项目之间的休息时间,而且还在这个间隙进行软件开发。

Git的背景就是这样的,Linus出品的工具,一定是精品。先去网站上把它下载下来,然后安装。注意:安装的时候不要把原来的系统路径给覆盖了,每一步一定要读说明,不要无脑点击。

下面先介绍下SSH,再进入GitHub

SSH

用Git就不得不提SSH (Secure SHell),中文名叫“安全外壳协议”,当然我还是习惯叫它SSH。SSH是一种加密网络传输协议,用来在网络中创建安全的隧道来实现客户端和服务器之间的通讯。按照以太网协议的通讯过程,所有的通讯传输内容都可以被第三者截获,而通讯双方不会发现(仔细想想,我们每次通讯会经过路由器、出校节点、运营商节点...每个节点都可以知道我们通讯的传输内容)。SSH的作用就在于加密双方的通讯内容,而使得第三方截获的传输内容毫无意义。(这里先挖个坑,以后我再来写关于加密通讯的内容)

SSH 通讯建立过程

主要可以分为下面几个步骤:

  1. 版本号协商阶段
  2. 密钥和算法协商阶段
  3. 认证阶段
  4. 会话请求阶段
  5. 会话交互阶段

版本号协商阶段

版本号协商阶段主要是为了判断服务器和客户端使用的ssh版本号是否相互兼容(若服务器端版本号比客户端版本号低,且客户端能兼容服务器端版本号,则使用服务器端版本号;反之,使用客户端版本号)。如果协商成功,则进入密钥和算法协商阶段;反之,TCP链接断开。

密钥和算法协商阶段

这里涉及到一些非对称加密的知识,下面先简单介绍下(这个也挖个坑,后面来填吧)。

在通讯的过程中,通讯的双方要有对方的公钥。顾名思义,公钥的意思就是公开的钥匙,用公钥加密的文件,公钥是解密不了的,只有用对应的私钥才能解密。如下图所示,在最开始Bob把自己的公钥给Alice,Alice把自己的公钥给Bob,然后Alice将要发送的信息用Bob的公钥加密后发给Bob。这个时候即使Eve截取了这段信息,TA看到的也是一堆乱码。当Bob收到这堆“乱码”后,用自己的私钥去解密,也就完成了一次非对称加密和解密的过程。Bob向Alice发送信息的时候同理。一般密钥的长度是2048,按照这个复杂度,目前的计算机不可能在有限长的时间内将密文暴力破解。因此,通讯过程是“很安全”的。(整个通讯过程看起来很完美,但任何系统都是有漏洞的,这个漏洞就是著名的中间人攻击,等后面再填坑。)

BobAlice

当经过版本号协商阶段之后,服务器端先将自己的公钥发给客户端,同时将会话ID也一起 发给客户端。

客户端也会产生自己的公钥密钥对,并且用收到的会话ID异或上自己的公钥,最后再将异或后的数据通过服务器端的公钥加密后发送至服务器端。

服务器端收到加密后的数据后,先用自己的私钥解密,再异或一次,就得到了客户端的公钥。

这样双方都知道到对方的公钥,以及当前会话的ID,后面的数据传输都通过这样的方式进行。

认证阶段

认证的方式可以分为基于口令的认证方式(也就是我们常说的账号密码),也可以是公钥私钥的方式。

口令方式

客户端用上一步得到的公钥来加密登录账号和密码,然后发送给服务器端,服务器端收到之后进行解密,并合自己的账号密码进行判断,如果一致就登录成功啦。

公钥-密钥方式

客户端使用上一步得到的公钥来加密自己的认证公钥,然后发送给服务器端,服务器端解密得到自己的认证公钥,如果和本地存储的认证公钥一致,就生成一段随机的字符串,先用认证公钥加密,然后在用上一步的到的通讯公钥进行加密,并把这个双重加密后的信息发给客户端。

客户端收到之后进行两次解密,得到服务器端生成的随机字符串,然后利用通讯公钥将这串字符串进行加密,发给服务器。

服务器收到之后再进行解密,并和自己生成的随机数进行对比,如果一致,登录就成功啦。

从安全的角度上来说,当然是使用公钥-密钥认证的方式更安全,毕竟密码更容易被破解和嗅探,当然公钥-密钥的方式也有一个缺点,就是计算机被黑了,自己的所有密钥都会被窃取。最好的办法是再给本地的密钥加一层密码,当然这是有代价的,每次登录的时候都要输一次密码。我们也不是什么高价值人物,不值得黑客花大力气来黑,因此用公钥-密钥的方式已经足够了。

公钥密钥设置

以git bash为例进行说明(如果你用的不是git bash我相信你已经不再需要这段教程了)

生成密钥

如果你是第一次生成公钥密钥对的话,直接在~路径下操作,输入下面的代码,最好带上注释,因为如果你有多个密钥还是需要一定的管理的。

ssh-keygen -C "注释"

然后就会出现下面的提示,要求输入密钥的文件名,第一次生成就不管它,直接回车设为默认值(因为需要ssh-keygen给生成一个默认的.ssh文件夹,尤其是装了Cadence的电脑,home路径会被改到SPB_Data路径下)

Enter file in which to save the key (/c/Users/WYu/AppData/Roaming/SPB_Data/.ssh/id_rsa):

接下来一通回车就好了

ssh-keygen

生成完之后就会有两个文件:id_rsa和id_rsa.pub,带.pub后缀的就是公钥,可以用cat id_rsa.pub进行查看

image-20211007211243541

最好把这两个文件的名字改了,改成有意义的文字,或者进入.ssh文件夹生成密钥,并且在生成的时候将文件名设置好。

将公钥放到 git 上

下面以git.ustc.edu.cn为例,登录进去之后点击右上角自己的头像,然后点击Preference

image-20211007211738529

然后在左边点击SSH Key

image-20211007211821272

然后在对应的框中粘贴公钥即可

image-20211007212014743

本地设置

在 git bash 中新建一个文件夹,用 vim 打开,填入如下的内容

Host git.ustc.edu.cn
        HostName git.ustc.edu.cn
        IdentityFile ~/.ssh/你的密钥

image-20211007212159435

Git 的操作

设置好前面的步骤之后就可以开始git的操作了

[先看这个教程吧,后面我再搬运]

results matching ""

    No results matching ""