公开密钥加密:两个明显的问题
前面举了小明登陆社交网站XX的例子,并提到,单纯使用公开密钥加密存在两个比较明显的问题。
- 公钥如何获取
- 数据传输仅单向安全
问题一:公钥如何获取
浏览器是怎么获得XX的公钥的?当然,小明可以自己去网上查,XX也可以将公钥贴在自己的主页。然而,对于一个动不动就成败上千万的社交网站来说,会给用户造成极大的不便利,毕竟大部分用户都不知道“公钥”是什么东西。
问题二:数据传输仅单向安全
前面提到,公钥加密的数据,只有私钥能解开,于是小明的账号、密码是安全了,半路不怕被拦截。
然后有个很大的问题:私钥加密的数据,公钥也能解开。加上公钥是公开的,小明的隐私数据相当于在网上换了种方式裸奔。(中间代理服务器拿到了公钥后,毫不犹豫的就可以解密小明的数据)
下面就分别针对这两个问题进行解答。
问题一:公钥如何获取
这里要涉及两个非常重要的概念:证书、CA(证书颁发机构)。
证书
可以暂时把它理解为网站的身份证。这个身份证里包含了很多信息,其中就包含了上面提到的公钥。
也就是说,当小明、小王、小光等用户访问XX的时候,再也不用满世界的找XX的公钥了。当他们访问XX的时候,XX就会把证书发给浏览器,告诉他们说,乖,用这个里面的公钥加密数据。
这里有个问题,所谓的“证书”是哪来的?这就是下面要提到的CA负责的活了。
CA(证书颁发机构)
强调两点:
- 可以颁发证书的CA有很多(国内外都有)。
- 只有少数CA被认为是权威、公正的,这些CA颁发的证书,浏览器才认为是信得过的。比如VeriSign。(CA自己伪造证书的事情也不是没发生过。。。)
证书颁发的细节这里先不展开,可以先简单理解为,网站向CA提交了申请,CA审核通过后,将证书颁发给网站,用户访问网站的时候,网站将证书给到用户。
至于证书的细节,同样在后面讲到。
问题二:数据传输仅单向安全
上面提到,通过私钥加密的数据,可以用公钥解密还原。那么,这是不是就意味着,网站传给用户的数据是不安全的?
答案是:是!!!(三个叹号表示强调的三次方)
看到这里,可能你心里会有这样想:用了HTTPS,数据还是裸奔,这么不靠谱,还不如直接用HTTP来的省事。
但是,为什么业界对网站HTTPS化的呼声越来越高呢?这明显跟我们的感性认识相违背啊。
因为:HTTPS虽然用到了公开密钥加密,但同时也结合了其他手段,如对称加密,来确保授权、加密传输的效率、安全性。
概括来说,整个简化的加密通信的流程就是:
- 小明访问XX,XX将自己的证书给到小明(其实是给到浏览器,小明不会有感知)
- 浏览器从证书中拿到XX的公钥A
- 浏览器生成一个只有自己自己的对称密钥B,用公钥A加密,并传给XX(其实是有协商的过程,这里为了便于理解先简化)
- XX通过私钥解密,拿到对称密钥B
- 浏览器、XX 之后的数据通信,都用密钥B进行加密
注意:对于每个访问XX的用户,生成的对称密钥B理论上来说都是不一样的。比如小明、小王、小光,可能生成的就是B1、B2、B3.