HTTPS背景:
HTTPS是由网景公司(Netscape)于1994年发明的。在当时,网络刚刚兴起,人们开始使用互联网进行各种通信和交易,但是网络安全问题也随之成为人们关注的焦点。网景公司的工程师们在HTTP协议的基础上开发了SSL(Secure Sockets Layer)协议,通过在传输层对数据进行加密,从而保障网络传输的安全性。
后来,SSL协议逐渐得到了广泛的应用和推广,并在1999年被标准化为TLS(Transport Layer Security)协议。TLS协议是SSL的升级版,具有更高的安全性和可扩展性,被广泛应用于Web浏览器和Web服务器之间的数据传输,以确保网络通信的安全和隐私。
尽管网景公司在1998年被AOL收购,但HTTPS协议仍然被广泛应用于现代互联网中,成为了保护网络通信安全的标准协议。
HTTPS协议:
HTTPS是一种用于保护互联网通信安全的协议,全称为超文本传输安全协议(Hypertext Transfer Protocol Secure)。它是基于HTTP协议的加密传输协议,通过在传输数据之前使用加密算法(利用 SSL/TLS
来加密数据包)对数据进行加密,以确保通信的安全性。
HTTPS协议的加密过程主要分为三个步骤:握手、加密和身份验证。具体步骤如下:
握手阶段:客户端向服务器发起HTTPS连接请求,服务器会向客户端发送数字证书和公钥,客户端会验证证书的有效性,如果证书通过验证,客户端就生成一个随机数,使用服务器的公钥对其进行加密,然后将加密后的随机数发送给服务器。
加密阶段:服务器使用私钥解密客户端发送过来的随机数,然后使用这个随机数生成对称密钥,再将对称密钥用客户端的公钥进行加密,发送给客户端。客户端使用私钥解密服务器发送过来的对称密钥,然后使用这个密钥对所有传输的数据进行加密。
身份验证阶段:在握手阶段,客户端会验证服务器的数字证书,以确认连接的安全性。而服务器也可以要求客户端进行身份验证,以确认客户端的身份。
使用HTTPS协议可以有效地保护网站的访问安全性,防止数据被窃听、篡改、伪造等问题。对于一些需要保密性的数据交互,例如金融交易、个人账户信息等,使用HTTPS协议进行加密传输是非常必要的。
HTTPS的发明主要是为了解决HTTP协议的安全问题。
因为HTTP协议是一种基于文本的协议,所有传输的数据都是明文传输,因此容易被黑客截获并窃取敏感信息。例如,当用户在浏览器中输
入用户名和密码时,这些信息就以明文形式在网络上传输,黑客可以通过截获这些数据来获取用户的敏感信息。
HTTPS通过在HTTP协议的基础上增加了加密传输的功能,将传输的数据进行加密,从而保证通信的安全性。这使得HTTPS协议可以有效地保护网站的访问安全性,防止数据被窃听、篡改、伪造等问题。
此外,随着网络的发展和应用场景的不断拓展,越来越多的网站需要进行身份验证和身份认证。HTTPS协议通过数字证书的方式,可以对服务器和客户端进行身份验证,防止恶意用户伪造网站,从而保护用户的隐私和财产安全。
因此,HTTPS协议的发明是为了保障网络通信的安全和隐私,保护用户敏感信息不被窃取、篡改和伪造,使用户能够更加安全地浏览网页和进行网上交易。
HTTP(HyperText Transfer Protocol)是一种基于文本的协议,用于在Web浏览器和Web服务器之间传输数据,它的数据传输是明文传输,不提供加密和安全保障。而HTTPS(HyperText Transfer Protocol Secure)是HTTP协议的安全版本,提供了加密和身份认证的功能。
以下是HTTP和HTTPS之间的主要区别:
数据传输安全性
HTTP传输的数据是明文传输的,容易被黑客截获并窃取敏感信息。而HTTPS在HTTP的基础上增加了加密传输的功能,将传输的数据进行加密,从而保证通信的安全性。
传输协议
HTTP是基于TCP/IP协议进行通信的,而HTTPS在HTTP的基础上加入了SSL/TLS协议进行加密,以保证数据传输的安全性。
端口号
HTTP默认使用80端口进行传输,而HTTPS默认使用443端口进行传输。
证书和身份认证
HTTPS使用数字证书进行身份验证和身份认证,确保客户端和服务器的安全连接。而HTTP不需要进行身份验证和身份认证,容易被攻击者伪装。
性能
由于加密和身份验证的额外开销,HTTPS相对于HTTP会增加一些网络负载和延迟,因此会有一定的性能损失。
综上所述,HTTPS相比于HTTP具有更高的安全性和可信度,但会增加一定的性能开销。因此,对于需要保护用户隐私和数据安全的网站,应该采用HTTPS协议来确保通信的安全性。
采⽤单钥密码系统的加密⽅法,同⼀个密钥可以同时⽤作信息的加密和解密,这种加密⽅法称为对称加密,也称为单密钥加密。其特征是:加密和解密所⽤的密钥是相同的。
最常见的对称算法包括AES(Advanced Encryption Standard)、DES(Data Encryption Standard)和3DES(Triple Data Encryption Algorithm)。
对称加密的特点:
对称加密其实就是通过同⼀个 “密钥”,把明文加密成密文,并且也能把密文解密成明文。例如一个简单的对称加密:按位异或。
假设明文:a = 1234,密钥:key = 8888。
则加密 a ^ key 得到的密文b为9834。
然后针对密文 9834 再次进行运算 b ^ key,得到的就是原来的明文 1234。
对于字符串的对称加密也是同理,每⼀个字符都可以表示成⼀个数字。
当然,按位异或只是最简单的对称加密,而HTTPS中并不是使用按位异或来进行加密。
非对称加密需要两个密钥来进⾏加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
常见的非对称加密算法包括RSA(Rivest-Shamir-Adleman)、DSA(Digital Signature Algorithm)和ECC(Elliptic Curve Cryptography)。
非对称加密的特点:
公钥和私钥是配对的,最大的缺点就是运算速度非常慢,比对称加密要慢很多。一般加密和解密方式如下:
也可以反着使用:
数据摘要(Data digest),也称为哈希值(Hash),是指将任意长度的数据通过一个特定的算法,转化成固定长度的数字或字母序列。摘要值通常具有以下特点:
输入数据的任意微小变化都会导致输出结果的明显差异。
输入数据相同,生成的摘要值也必定相同。
摘要值是不可逆的,无法通过摘要值推算出原始数据,通常用来进行数据对比判断数据有没有被窜改。
摘要常见算法包括MD5、SHA-1、SHA-2等。需要注意的是,由于摘要值是固定长度的,因此无论输入数据有多长,摘要值的长度总是相同的。这意味着在输入数据较大时,可能会发生哈希碰撞(Hash collision),即两个不同的输入数据生成了相同的摘要值,因此在使用哈希算法时需要注意这种风险。
数字签名(Digital Signature)是指利用公钥密码学技术对数字信息进行签名,以证明信息的完整性、来源和不可抵赖性。数字签名通常包括两个过程:签名和验证。
在签名过程中,发送方使用私钥对原始数据进行加密,生成数字签名。数字签名可以证明发送方对原始数据进行了签名,并且保证数据的完整性和不可抵赖性。在验证过程中,接收方使用发送方的公钥对数字签名进行解密,以验证数字签名的真实性和完整性。
数字签名的主要作用是确保数字信息的可靠性和安全性。它可以防止信息被篡改、冒充和否认,同时也能确保信息的来源和完整性。数字签名技术在电子商务、电子政务、网络支付和数字版权保护等领域得到了广泛的应用。
常用的数字签名算法包括RSA、DSA、ECDSA等。其中,RSA是最常用的数字签名算法之一,它使用公钥加密、私钥解密的方式对数字信息进行签名和验证。DSA和ECDSA则是基于椭圆曲线密码学的数字签名算法,具有更高的安全性和更短的密钥长度。
如果通信双方都各自持有同⼀个密钥X,且没有别人知道,这两方的通信安全当然是可以被保证的(除非密钥被破解)。
引入对称加密之后,即使数据被截获,由于黑客不知道密钥是啥,因此就无法进行解密,也就不知道请求的真实内容。
但事情没这么简单。服务器同一时刻其实是给很多客户端提供服务的。这么多客户端,每个的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了,黑客就也能轻易拿到)。因此服务器就需要维护每个客户端和每个密钥之间的关联关系,这也是个很麻烦的事情。
比较理想的做法就是能在客户端和服务器建立连接的时候,双方协商确定这次的密钥:
但是如果直接把密钥明文传输,那么⿊客也就能获得密钥了,此时后续的加密操作就形同虚设。因此密钥的传输也必须加密传输,但是要想对密钥进行对称加密,就仍然需要先协商确定⼀个 “密钥的密钥”,这就成了 “先有鸡还是先有蛋” 的问题了。此时密钥的传输再用对称加密就行不通了。
鉴于非对称加密的机制,如果服务器先把公钥以明文方式传输给浏览器,之后浏览器向服务器传数据前都先用这个公钥加密好再传,从客户端到服务器信道似乎是安全的,因为只有服务器有相应的私钥能解开公钥加密的数据。
但是服务器到浏览器的这条路怎么保障安全?
如果服务器用它的私钥加密数据传给浏览器,那么浏览器用公钥可以解密它,而这个公钥是⼀开始通过明文传输给浏览器的,若这个公钥被中间人劫持到了,那他也能用该公钥解密服务器传来的信息了,因此只使用非对称加密也是行不通的。
例如:
这样的加密方式看似行得通,但是别忘了非对称加密最大的缺点就是运算速度非常慢,因此效率会非常低,并且也会存在安全问题。
例如中间人在双方建立连接一开始就截取了服务端发送给客户端的公钥,然后替换成自己的公钥,因此客户端就会误以为是服务端的公钥,导致此后双方通信的数据被破解。
由于对称加密的效率比非对称加密高很多,因此只是在开始阶段协商密钥的时候使用非对称加密,后续的传输仍然使用对称加密。
虽然上面的加密方式已经比较接近实际原理了,但是依旧有安全问题。因为方案2、方案3、方案4都存在⼀个共同的问题:那就是如果最开始建立连接的时候,中间人(Man-in-the-MiddleAttack,简称“MITM攻击”。)就已经开始攻击了呢?
中间人攻击:针对上面的场景:
在方案 2/3/4 中,客户端获取到公钥S之后,对客户端形成的对称秘钥X用服务端给客户端的公钥S进行加密,中间⼈即使窃取到了数据,此时中间⼈确实无法解出客⼾端形成的密钥X,因为只有服务器有私钥S’。但是中间人的攻击,如果在最开始握手协商的时候就进行了,那就不⼀定了,假设hacker已经成功成为中间人:
上⾯的攻击方案,同样适用于方案2和方案3。其问题的本质就是:客户端无法确定收到的含有公钥的数据报⽂,就是目标服务器发送过来的!
CA认证:
CA证书(Certificate Authority Certificate)是一种数字证书,由认证机构(Certificate Authority,简称CA)颁发给其它数字证书。它是一种用于身份验证和加密通信的工具,用于确保网络通信的机密性、完整性和可信性。
CA是一个第三方机构,其任务是验证证书申请人的身份,并为该申请人颁发数字证书。数字证书中包含了证书申请人的公钥、CA的公钥以及其他相关信息,包括证书有效期和用途等。
当一个用户在浏览器中访问一个使用了数字证书保护的网站时,浏览器会验证该网站的数字证书是否由已知和可信任的CA颁发,并且证书是否已被撤销。如果验证成功,浏览器将建立一个安全的加密连接,确保所有通信都是加密的、完整的和安全的。
这个 证书 可以理解成是⼀个结构化的字符串,里面包含了以下信息:
- 证书发布机构
- 证书有效期
- 公钥
- 证书所有者
- 签名
- 服务器的基本信息
- …
需要注意的是:申请证书的时候,需要在特定平台生成,才会同时生成一对公钥和私钥。这对密钥就是用来在网络通信中进行明文加密以及数据签名的。其中公钥会随着CSR文件,⼀起发给CA进行权威认证,私钥服务端自己保留,用来后续进行通信(其实主要就是用来交换对称秘钥)。
当服务端申请CA证书的时候,CA机构会对该服务端进行审核,并专门为该网站形成数字签名,过程如下:
服务端申请的证书明文和数字签名S,共同组成了数字证书,这样一份数字证书就可以颁发给服务器了。
在客户端和服务器刚⼀建⽴连接的时候,服务器给客户端返回⼀个证书,其中包含了之前服务端的公
钥,也包含了网站的身份信息。
客户端进行认证:
当客户端获取到这个证书之后,会对证书进行以下校验,以防止证书是伪造的。
中间人有没有可能篡改该证书?
如果中间整个掉包证书?
使用HTTPS进行通信的完整流程:
HTTPS工作过程中涉及到的密钥有三组:
其实⼀切的关键都是围绕这个对称加密的密钥,其他的机制也都是辅助这个密钥进行工作的。