加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.52wenzhou.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 酷站推荐 > 酷站 > 正文

GoLang:你真的了解 HTTPS 吗?

发布时间:2020-03-03 18:33:58 所属栏目:酷站 来源:站长网
导读:副标题#e# 一直以来,在实验室甚至整个公司特别强调安全和隐私,近半年,笔者在用 GoLang 开发智能边缘计算设备的网络通信项目时,常被要求务必重视通信的安全和隐私。期间,对接了多个合作方,有的要求公网下要防止域名劫持,有的要求客户端上报要带证书啊

那么解决办法有吗?有,文章随后说道:

(3)解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。  

确实,HTTPS(最开始)就是这么做的!其思路大致如下:

首先一定要明确HTTPS既有对称加密,又有非对称加密。

由于对称加密性能高速度快,因此在传输数据时(也就是对话内容)采用对称加密。

但是对称加密的密钥SK,既没办法预先设置(密钥不可能只有一把,服务器端维护大量密钥也不具备可行性),因此只能选择在对话前通过网络协商出一把新的SK。

为了确保SK的传输安全,使用非对称加密来协商SK。

HTTPS 的这种设计同时兼顾了安全和效率,赞叹先驱们的智慧!

问题 2:HTTPS 对称加密的密钥 SK 如何产生和传输?

通过第一个问题,我们知道了 HTTPS 分为2 个过程:

协商对称加密密钥 SK 的非对称加密阶段,称为TLS 握手阶段。

使用 SK 对数据(对话内容)进行对称加密的阶段,称为数据通信阶段。

过程 2数据通信阶段:发送端首先用密钥 SK 对通信内容进行对称加密,接着通过网络传输出去;对端收到数据后,用 SK 先将数据解密,于是就得到了通信内容。这里笔者有一个问题尚未求证:在数据传输过程中,是否会对通信数据进行哈希以确保其不被篡改?姑且记一笔。

过程 1TLS 握手阶段:协商密钥 SK。网上关于这个知识点的文章有很多,然而一些已经过时,一些则不全。就协商密钥 SK 这块,笔者推荐《扫盲 HTTPS 和 SSL/TLS 协议[3]:密钥交换(密钥协商)算法及其原理》和《密钥协商机制》。本文直接扔出结论,HTTPS 协商对称加密密钥 SK 的办法有很多种,介绍 3 种较为常见的办法:

基于非对称加密算法

基于专用密钥交换算法,常见有 DH、ECDH 等

基于共享的 secret,常见有 PSK,SRP 等

(1) 方法 1:基于非对称加密算法

维基百科对于非对称加密算法的解释:公开密钥密码学(英语:Public-key cryptography)也称非对称式密码学(英语:Asymmetric cryptography)是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;一个用作加密,另一个则用作解密。使用其中一个密钥把明文加密后所得的密文,只能用相对应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密。由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密。虽然两个密钥在数学上相关,但如果知道了其中一个,并不能凭此计算出另外一个;因此其中一个可以公开,称为公钥,任意向外发布;不公开的密钥为私钥,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。

非对称加密 RSA 协商密钥的办法,是 HTTPS(严格说是 SSL/TLS 协议)最早的办法,其过程如下:

GoLang:你真的了解 HTTPS 吗?

客户端给服务端发送请求;

服务端返回客户端自己的公钥 PuK;

客户端产生本次对话的对称密钥 SK,并用 PuK 进行加密得到 SK_Enc 后传给服务端;

服务端收到 SK_Enc 后用自己的私钥 PrK 解密得到 SK;若成功,则返回客户端 OK,否则终止对话.

接下来,客户端和服务端的对话均用 SK 加密后传输。

(2) 方法 2:基于专用密钥交换算法

方法 1 是被大部分人熟知的,但是存在一个问题:如果服务端的私钥 PrK 泄露了,那么 HTTPS 所做的加密也就不安全了。

因此,就有了密钥交换算法(有说法是 keyless 方法)。方法原理笔者没有深究(数学功底有限,看到大量的公式证明还是会烦…),DH 和 ECDH 协商密钥算法大致过程如下:

GoLang:你真的了解 HTTPS 吗?

ECDH 算法中的 A 和 B,在有的材料中也被称为PreMaster-Secret。最终协商得到的密钥 SK 也被称为Master Secret,也被称为Session Key。

直接给出结论:ECDH 比 DH 算法更快,有说法是 10 倍;而且 ECDH 比 DH 更难破解,可行性更好。

(3) 方法 3:基于共享的 secret

这类做法就是在客户端和服务端预设好对称加密密钥,握手阶段只需要传递类似钥匙 id 即可。代表算法有 PSK。

问题 3:HTTPS 的有几套非对称加密?目的是什么?是否可以省略?

直接给出答案:2 套非对称加密。

第一套用于协商对称加密密钥 SK(问题 2 一直在讨论的内容);第二套用于数字证书签名加密(接下来一章会详细讨论 CA 证书)。这两者的区别是:前者是服务器端(如果是双向验证的话,客户端也会有一套非对称加密公私钥)产生的。私钥在服务端上;后者是 CA 机构产生的,私钥在 CA 机构那边。

并且,这 2 套都不可以省略。(这个说法略不严谨,但是在实际操作中,确实都不建议省略。)

三、身份验证:HTTPS 的证书

笔者认为,对大部分程序员来说,工作中遇到的 HTTPS 相关问题,80%~90%都是跟证书相关的。因此,了解证书非常关键!

1. 证书是什么?

解释这个问题之前,先看几个关键词:CA,CA 机构,数字证书,数字签名,(证书)指纹,(CA)证书,HTTPS 证书,SSL/TLS 证书。

理一理上面这些关键词之间的关系:

CA,CA 机构:机构/组织概念。

数字证书,(CA)证书,HTTPS 证书,SSL/TLS 证书:CA 签发的数字证书。

数字签名,(证书)指纹:CA 签发的证书的内容之一,一段加密的密文。

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读