曾几何时,我们在使用Git时,通过git clone
克隆源码时,发现有https
和ssh
两种方式(下载压缩包的方式就不提了,我们怎么可以这么low?),会发现用ssh
的方式下载会失败:
实际上,用HTTPS的方式即可,输入用户名密码进行验证,并且现在也不是每次都要输入用户名密码,操作系统会记忆,不过也可以自己去配置用户名密码,达到避免每次https方式clone或push都要输入密码的尴尬。(关于https和ssh两种方式,可自行谷歌搜索区别)
我们回到ssh方式,初学者可能不知道发生了什么,按照网上的教程进行了如下的配置:
git config --global user.name "你的git用户名"
git config --global user.email "你的git所用邮箱"
配置好之后可以看下:
$ git config --global --list
user.email=你的git所用邮箱
user.name=你的git用户名
下一步生成了一对公钥和私钥(这里牵涉到非对称加密,下面会进行详细说明):
ssh-keygen -t rsa -C "这里换上你的邮箱"
简单来说,就是不断回车即可。我的电脑是windows系统,我们可以看到生成的密钥对放在了/c/Users/fossi/.ssh/id_rsa
。
在指定的保存路径下会生成2个名为id_rsa
和id_rsa.pub
的文件,接下来就很简单了,将id_rsa.pub
中的内容拷贝到git上。
好了,这次我们大功告成了。耶!
可是,以上是git的一些配置,跟我本篇文章有半毛钱关系?实际上我们完成了ssh公钥登陆。后续你就再也不用重复输入账号密码,并且我们上面用到的一对密钥,实际上用到了非对称加密。这个关键字是我们本篇文章的核心讨论点。
此外,我们还明白了git配置的这一步到底是用来干啥的,也是大大的收获。
关于ssh公钥登陆原理,我们用更加明显的对比来说明。
我们登陆过服务器的人知道,可以通过SSH协议登陆:
ssh user@host
主要有两种登录方式:第一种为密码口令登录,第二种为公钥登录。
密码口令登录,通过密码进行登录,主要流程为:
公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:
上文提到了RSA加密方案,就是主流的非对称加密的算法方案。既然有非对称,必然也会有对称,下面我们进入加密学世界。
在密码学中,明文是指传送方想要接收方获得的可读信息,明文经过加密所产生的信息被称为密文,而密文经过解密还原得来的信息就是明文。如果在互联网上传输明文,那是很危险的。比如这个场景:
如果有一个手段高明的黑客窃听甚至还顺便篡改了密码,那真的就完犊子了:
回到我们普通人的世界,我们可能会通过网页去购物,可能会通过网页去买票,试想,你的账号被窃听,甚至你输入的银行卡号和密码也被窃听,是一件多么恐怖的事情!宛若裸泳在这个纷繁的网络世界里,不禁让人胆颤!
怎么办呢?加密!
我们先来了解比较简单的对称加密。简单并不意味着不保险(有很安全的对称加密算法)。简单意味着功能比较好理解。
对称加密算法用一个密钥来加密信息,同样地,也是用这一个密钥来解密。注意,全程只有一个密钥。
因此,不难理解,对称加密中“对称”的意思就是指加密和解密使用的是同一个密钥。因此加密方和解密方都需要知道这个密钥。
只要黑客不知道密钥是什么,那么就算被他窃听到,他也无法解密出明文。是不是超级简单?对称加密比较出名的是 AES 算法。
但是问题就出在这个密钥本身安全性上,因为两端都需要知道这个密钥才行,可能某一方把密钥传给对方才行。
但是他们怎么传递呢?假如他们传递密钥用的是明文,那么黑客照样可以截获密钥,接下来就可以解密任何传递的加密信息了。因此,对称加密虽然强大,但是有一个致命的缺陷:必须谨慎地传递密钥。但这几乎是不可能的:因为首先得把密钥传递过去。
让我想起密码学中的一个根本性原则:kerckhoffs
原则。这个原则说的是:密码体制的安全性不依赖于算法的保密,而仅仅依赖于密钥的保密。
既然对称加密有点问题,我们先来看看非对称加密。
非对称是相对于对称而言的,他两一对比就知道啦:
在非对称加密中有两个密钥:
公钥只用来加密。因此,用非对称加密的算法,我们就只能用私钥来解密。
回到我们一开始配置git公钥登录的时候,我们是不是生成了一对公钥和私钥?非对称加密也很简单,假设我们的公钥和私钥分别为:
公钥可以在网络上以明文传输,毕竟是公开的密钥嘛。即使公钥被不怀好意的黑客截获也无所谓。但是,用于解密的私钥却不能被公开传输,需要保管好。
非对称加密最出名的就是 RSA 算法。
1977 年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字的首字母命名,叫做 RSA 算法。
非对称加密有个致命弱点:非对称加密太消耗电脑资源了。非对称加密比对称加密要慢大概 100 ~ 1000 倍。
所以,我们能不能取两者长处共谋大计呢?
我们通过SSH协议来学习下如何组合使用兄弟两!
SSH 是英语 Secure SHell 的缩写,直译过来就是“安全的 Shell”,SSH 协议本身比较复杂,不去深究,我们就来大概了解下他是如何运用加密方法来保护数据的。
SSH 以如下顺序使用两种加密方法:非对称加密和对称加密。
下面一步一步来说明 SSH 是如何创建一个安全的通信管道的。
第一步:我们要交换一个对称加密用的密钥。但是我们不能以明文方式传递,我们很容易想到,用非对称加密的方式来加密用于对称加密的密钥。服务器将非对称加密的公钥以明文方式传输给客户机,使客户机可以用公钥来加密。
我们还是用上面的公钥和私钥来说明。
第二步:客户机收到服务器传给它的公钥之后,就会用公钥来加密自己的对称加密的密钥,假设是对称加密用的密钥是 superkey
。对称密钥得到加密后,只有服务器的私钥才能解密,拿到 superkey
!
最后,客户机和服务器都知道了对称加密的密钥是 superkey,关键是他们从没在网络间以明文传递过这个密钥。
因此,从现在开始他们可以用对称加密的方式互相发送加密的信息,不用再担心被黑客获取信息了。
不过做到这一步真的可以高枕无忧了吗?
试想下,给你公钥的不是真实服务器B,而是黑客呢?
这就是大名鼎鼎的中间人攻击!下篇文章来说说HTTPS是如何解决中间人攻击问题的。