HTTP之HTTPS与安全传输
一、事发之初
在网络世界中,人们通过操作Web客户端将数据request给网站服务器,而网站服务器也会将数据response给Web客户端,他们之间通过HTTP网络传输协议传输着数据。
在数据的传输过程中,充斥着大量的重要数据,比如:信用卡号,密码、姓名等等。
因此,一些攻击者利用协议漏洞,发现了商机。
二、HTTP的特性 - 明文传输
那些攻击者知道,HTTP协议对网络传输过程的数据不以加密修饰,从而使数据以明文传输,暴露在网络中
。那么截取Web浏览器和网站服务器之间的传输报文,使用一些软件可对传输的数据进行嗅探监听,随后对抓取到的数据包进行拆解,就可以轻而易举的获取里面重要的信息。长此以往,大量重要数据泄露,对个人、社会乃至国家安全造成严重的威胁。
因此HTTP不适合传输一些敏感信息。
三、秘钥的产生
为了提高HTTP的安全性,人们使用秘钥对数据进行加解密以及加验签
3.1 对称加密
(1). 原理
对称加密:加密和解密共用同一个秘钥,简单粗暴。
即,Web浏览器和Web服务器共用一套加解密算法作为秘钥。
- 在浏览器向服务器发送请求时,使用秘钥加密请求。
服务器收到加密后的请求后,使用同一个秘钥进行解密。
- 在服务器向浏览器响应请求时,使用同一个秘钥加密响应。
浏览器收到加密的响应后,使用同一个秘钥进行解密。
(2). 延伸 - 最简单的对称加密—凯撒密码
将明文中的字母按照字母表中的顺序,往后移动指定位数,而被替换成密文。
如,将字母向后移动3位:good —> jrrg
凯撒曾用此方法与其手下进行联系,往后移动指定位数即为他们商定的共同秘钥。
(3). 常用技术
常见经典对称加密算法有:
DES,3DES,AES(AES-128),IDEA, 国密SM1,国密SM4
(4). 优点与缺点
优点:速度快。
缺点:加密和解密的钥匙必须相同,只有通信双方才能知道密钥。
在使用同一个共同秘钥之前,需要相互协商确认。
比如以服务器的秘钥为共同秘钥,但是客户端不清楚,那么服务器需要将秘钥网络传输给客户端,客户端才能跟服务器使用同一个秘钥,但是在网络传输的环境中,秘钥容易被中间人获取。当然,也可以线下协商秘钥,但是协商对象过多时,耗费时间与精力。(想想不同国家与地区的人,若采取线下协商,成对相聚,不是一个很理想的办法)
就像凯撒与手下需要协商,共同将字母后移3位进行加密,而且该协商过程需要秘密进行。但在网络环境中难以实现。
3.2 非对称加密
在对称加密的基础上,解决了秘钥分发的问题。
(1). 原理
非对称加密:不采用共同秘钥,而分为公钥(public key)和私钥(private key),公钥加密,私钥解密,并且彼此成对存在。其中,公钥对外公布,人人皆知,而私钥自己保留,只有自己知道,他们成对存在。
即,Web浏览器拥有自己的私钥以及网站服务器的公钥,而网站服务器拥有自己的私钥以及Web浏览器的公钥。
浏览器使用服务器公钥加密request,传给服务器,服务器使用自己的私钥解密。
随后,服务器使用浏览器公钥加密response,传给浏览器,浏览器使用自己的私钥解密。
(2). 常用技术
常用经典非对称加密算法有:RSA ,ECC和国密SM2
(3). 优点与缺点
优点:加密与解密秘钥不同,算法更加复杂,任何人都知道公钥,但只有一个人持有私钥可以解密。
缺点:非对称算法开销很大,所以如果以非对称技术来加密发送的消息,效率会很差。
RSA算法虽然固若金汤,但比对称加密算法慢上百倍,对每一个数据进行加密,会影响网络传输效率。
3.3 对称加密+非对称加密
(1). 原理
结合对称与非对称加密:使用非对称加密传输共同秘钥,随后使用对称加密传输数据。
客户端生成一个共同秘钥,用来后期传输数据。
客户端再使用服务器的公钥加密共同秘钥,作为数据向服务器发送请求。
服务器用自己的私钥解密数据,获得共同秘钥,由于共同秘钥是安全的,随后使用共同秘钥进行后续数据传输。
(2). 漏洞
由于服务器的公钥是公开的,所以,中间人使用服务器公钥对自己生成的共同秘钥加密成密文,传输给服务器,由于没有任何识别功能,此时服务器误以为是客户端的请求,用自己的私钥解密出错误的共同秘钥后,与中间人进行数据传输。
所以,这次问题出在公钥的分发上,虽然它是公开的,但是还是可以被非法者利用。
3.4 加验签
识别秘钥的原主
(1). 原理
加验签:用私钥对信息进行加密,用相应的公钥进行解密。(类似于非对称加密,但操作相反,可以归类于非对称加密)
客户端在向服务器发送信息时,使用服务器的公钥进行加密,这样即使信息丢失也不会被外人所知,因为只有服务器自己有自己的私钥,除此之外,客户端还可以使用自己的私钥对信息再进行加密(也叫加签),这样如果信息在传输过程中被替换或者修改,那么服务器不能用客户端的公钥解开,说明该数据不是来自客户端的。所以公钥可以验证发送者的身份,以及发送信息的可信度。
3.5 散列算法
(1). 特点
不可逆性、鲁棒性、唯一性
(2). 常用技术
常用经典散列算法有:MD5、SHA(SHA-256)、国密SM3
(3). 注意事项
使用时记得加盐
3.6 加密算法知识的扩展
AES - 是国际上最认可的密码学算法,只要算力没有极大的突破性进展,这种算法在可预期的未来都是安全的。
ECC - 是目前国际上加密强度最高的非对称加密算法。
MD5和SHA的唯一性被破解了,但是大部分场景下,不会构成安全问题。一般使用SHA-256加盐即可满足大部分使用场景。
四、CA证书
前面的加密算法在实际应用中都存在自己的漏洞,比如:
客户端在访问服务器的时候,中间人冒充服务器发送公钥,使客户端使用中间人的公钥加密共同秘钥,中间人用自己的私钥解密后,与客户端通过共同秘钥进行数据传输,窃取客户端信息。
可见,辨别公钥的来源是个关键
(1). 如何确定公钥的源头来自服务器而不是中间人?
证书的产生
CA- Certificate Authority 证书授权中心。
负责管理和签发证书的第三方机构,检查证书持有者的合法性,并签发证书,以防止证书被伪造或篡改。
这个中心不仅仅颁发一个用于证明网站服务器身份的证书,而且证书的基本信息中还包含这个网站服务器的公钥。那么,客户端拿到证书即可安全的取回服务器的公钥。
(2). 辨识了公钥的源头,但若在客户端取证书的过程中,即证书在网络传输过程中被篡改了公钥怎么办?
消息摘要的产生
Hash算法
将公钥与个人信息用一个Hash算法生成一个消息摘要
。只要对证书内的数据有细微的变化,生成的消息摘要就会产生巨大的变化,这样就可以防止别人修改原始内容。
(3). 既然源头和传输过程中,证书信息无法被篡改。伪造整个证书怎么办?
伪造的证书,其中的公钥和个人信息等在源头上已经异常,传输过程前后,Hash算法不会产生改变。
加验签
让认证中心CA对消息摘要使用私钥进行加密,形成数字签名
。只有对应配套的CA公钥才能解。
数字签名+证书 = 数字证书
将原始证书内容用Hash算法生成消息摘要,再将数字签名使用CA公钥解密,同样生成消息摘要,前后者对比查看有无篡改。无篡改即可拿到网站服务器的公钥,从而可以进行数据传输。
浏览器识别中间人的过程:
(4). 永无止境的公钥安全传输问题
第三方为最高层,保证了服务器和客户端之间的安全问题,但是第三方传输安全问题谁来保障?
中间人可以先修改证书内容,使用自己伪造的第三方私钥加密为数字签字,后面再用自己的公钥发送给客户端解密验证,消息摘要相同。于是中间人和客户端之间的连接再次被建立起来…
五、HTTPS实现原理
HTTPS在TCP和HTTP中间加入了SSL/TLS安全层。
大致实现流程如下:
采用对称加密的方式加密传输数据,采用非对称加密的方式传输秘钥,既可解决传输效率问题,也能保证两端数据的安全传输。除此之外为了了能够证明服务器使可靠的,引入了数字证书,让浏览器验证证书的可靠性。