WindChaser 2019-06-26
一些教程经常提到 POST 比 GET提交数据更安全,真正从安全的角度来说,只要是 Http 请求,都不安全 。(补充 @王泥煤 的回复 post的确比get更安全,这一点与https无关。因为用get方式传密码会被日志系统记录下明文,或者被第三方的referer带出去,即便你采用了https)
只要使用 Http协议,不论做任何安全措施都是徒劳的,只有Https 协议才保证数据在传输过程中的安全。
问题来了,什么是安全?
数据传输的安全其实体现在以下几个方面:
Https 怎样保证数据传输安全?再讲讲 Https的原理之前必须先聊一聊数据加密,目前有以下几种加密方式:
理解了加密方式后我们就能利用这些算法实现安全数据传输。以一个故事开始:
班里来了个新同学小美,长的特别漂亮,小谷暗恋小美很久,终于有一天小谷鼓起勇气向小美表白。小谷写了个纸条:“我是小谷,我喜欢你,你喜欢我吗?” ,让小王转交给小美。
正常情况下,小王会把纸条转给小美,小美看到后很开心,回复了纸条:“我是小美,我也喜欢你”,让小王再转递给小谷。
可是小王也暗恋小美,当然不愿甘做嫁衣。这个时候小王可以有几方法来捣乱:
小谷很聪明,早就看出来小王心怀不轨,可是没办法,要传信必然要经过小王,要怪就怪自己太腼腆不敢下课直接亲手送上。怎么办呢?
有一种办法是把纸条的信息加密(AES 加密),小王就不知道纸条内容了。可是问题来了,小美也不知道密钥,她收到信后也无法解密啊。倒是可以把密钥放到纸条里,可这样小王也得到了密钥等于白忙活一场。
再说说小美,小美很漂亮,在以前的学校被称为数学女神,转学到这里后立即被小谷吸引了,她看出来小谷有点喜欢自己但又不十分确定,她不想主动。她猜到小谷会在上课的时候可能用写纸条的方式表白,也猜到猥琐的小王会在中间捣乱。如何让小谷能顺利向自己表白呢?小美在疯狂的思考:
方案一: 我可以生成一对公钥和私钥,把公钥公开给班里所有的同学。这样小谷就能得到公钥,把要发的信息用公钥加密,只有我自己能用私钥解密。可是我如何把我的回复发出去呢?如果用我的私钥加密,小谷倒是能用公钥解密,但班里任何同学都能解密,被其他同学看到就糗大了。而且如果小谷纸条的内容太多,他用公钥加密需要花一整节课的时间,不能耽误他学习
方案二:我可以生成一对公钥和私钥,把公钥公开给班里所有的同学,这样小谷就能得到公钥。如果小谷够聪明的话,他得到公钥后会生成一个对称加密AES的密钥,然后用我的公钥把 AES 密钥加密(AES 密钥长度很短加密几乎不需要时间),然后把加密后的密钥发给我。我收到后用我的私钥解密,得到小谷和我约定的对对称加密密钥,然后我们用这个只有我们俩知道的对称密钥加密数据进行交流。
下课休息的时候,小美给班里的同学说:“快数学考试了,我的数学很好,考场上需要要我帮忙的同学可以找我,我公布一下我的公钥,为了安全起见大家用我的公钥加密消息。”
一切貌似天衣无缝,可是小美在班里公布自己公钥的时候小谷正好拉肚子去了厕所,回来之后才知道这事,小谷于是问旁边的同学小花小美公钥是多少。小花以前是班里受欢迎的女生被很多男生仰慕,在小美来之后立即被夺了风头,一直怀恨在心。于是小花告诉了小谷一个假公钥,其实是自己生成的公钥。这样万一小谷找小美要小抄,自己可以冒充小美给一个错答案。
一切被小美看到眼里,这样不行啊, 别到时候自己和小谷的好事没成,反而同学考试被陷害栽赃到自己头上。怎么办呢?对了,班长是班里人品很正的人,可以用班长给自己做信用背书,正好前两天班长在班里通知了自己的公钥。 于是小美找到班长,做了一个证书,证书上有自己的名字、学号、公钥、公证人班长的名字,同时把这些信息通过 Hash (sha256)处理后请求班长用自己的私钥进行加密(为什么用 Hash 处理?因为东西太多非对称加密很费时),也放到证书上。于是小美再次把证书通报给班里所有的同学。
小谷这次得到了证书,发现上面的公证人是班长,于是先用班长的公钥对证书上被班长私钥加密后的字段进行解密,得到元素数据的 Hash。 再对元素数据进行 Hash和刚刚解密的 Hash 进行比对。如果比对成功表示证书上的信息无误,且是由班长担保的。这时候小谷确信证书上的公钥就是小美的。任何人因为没有班长的私钥都无法伪造证书。
你以为故事就这么圆满结束了吗?其实没有,班长前两天在公布自己的证书的时候小谷正好生病请假了。 他根本不知道班长的公钥是不是他本人的。
这个时候他发现班长的证书上有班主任的担保(班主任的公钥做了签名),班主任的证书上有校长的担保,而小谷是有校长的的公钥的,就印在学生证上。
终于,小谷收获了女神的芳心。
故事完了。故事中 小谷是浏览器,小美是服务器,小花和小王是坏蛋,班长是 CA 机构,班主任是上级 CA,校长是根 CA 服务器。当一个网站要使用 https 时先需在一些国际认证的 CA 机构填写网站信息申请证书,而这些 CA机构往往还有上层 CA,最终有一个根 CA。一般来说浏览器都会内置根 CA 和一些顶级 CA 的证书,但需要验证的时候会通过 CA 链逐级验证。