HTTP的局限性及应对措施
1.窃听风险:通信使用明文(不加密),内容可能会被窃听
-
为了防止内容被窃听,可以从对通信加密和对内容加密两方面入手。
-
通信的加密:可以通过和SSL或TLS的组合使用,加密HTTP的通信内容。即简历安全通信线路后通信
-
内容的加密:对报文主体内容进行加密,要求客户端和服务端同时具备加密和解密机制。
2.冒充风险:不验证通信方的身份,因此有可能遭遇伪装(中间人攻击)
-
服务器可能遭遇伪装;客户端可能遭遇伪装;无法判定访问权限;无法判定请求对象;无法阻止海量请求的攻击。
-
通过证书来确定身份:伪造证书从技术角度来说是很困难的一件事,因此可通过证书来确定。证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。
3.篡改风险:无法验证明文的完整性,所以有可能已遭篡改(中间人攻击)
- 通过MD5和SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法(下文详解)
HTTPS=HTTP+加密+认证+完整性保护
SSL是一个介于HTTP协议与TCP之间的一个可选层,为数据通讯提供安全支持。SSL协议可分为两层:
-
SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
-
SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL记录协议
1.SSL加密功能
-
共享秘钥加密:加密和解密同用一个秘钥的方式成为共享秘钥加密,也被称为对称秘钥加密。
-
公开密钥加密:使用一对非对称的秘钥。一把叫做私有秘钥,一把叫做公开秘钥。使用公开秘钥加密方式,发送密文的一方使用对方的公开秘钥进行加密处理,对方收到被加密的信息后,再使用自己的私有秘钥进行解密。利用这种方式,不需要发送用来解密的私有秘钥,也不必担心秘钥被攻击者窃听而盗走。
-
两种加密方式的局限性:公开秘钥方式不够安全,但处理速度较快;而共享秘钥方式足够安全,单处理速度较慢。
-
HTTPS采用混合加密机制:在正常的通信过程中,由于数据量很大,我们当然希望使用共享秘钥方式;但共享秘钥方式的加密解密数字相同,容易被窃取。因此,我们可以在通信建立的时候用公开秘钥方式对共享密钥进行加密,而在正式通信过程中使用该共享秘钥,也就实现了两者优点的结合。这就是混合加密机制。
2.SSL身份认证功能
-
公开秘钥加密方式还是存在一些问题的。那就是无法证明公开秘钥本身就是货真价实的公开秘钥。
-
为了解决这个问题,可以使用由数字证书认证机构和其相关机关颁发的公开秘钥证书。
-
数字签名:如何避免有人假装服务器端给客户端发送数据呢?正常的通信过程是使用公开秘钥加密,使用私有秘钥解密。而数字签名是一种逆向过程。使用私有秘钥加密文件并发送给客户端,客户端可以通过公开秘钥进行解密。如果可以使用公开秘钥解密,那么说明加密使用的是私有秘钥,而私有秘钥只有服务器端才有,也就证明了身份的正确性。
SSL握手协议
SSL握手协议的大概过程就是客户端通过公开秘钥方式获得共享秘钥,随后在通信过程中使用该共享秘钥进行加密解密。可以大概分为4次握手。
- 第一次握手:
客户端发出加密通信请求(ClientHello)
在这一步,客户端主要向服务器提供以下信息。
(1) 浏览器支持的SSL/TLS协议版本,比如TLS 1.0版。
(2) 一个浏览器客户端生成的随机数,稍后用于生成对称加密算法的"对话密钥"。
(3) 浏览器支持的各种加密方法,对称的,非对称的,HASH算法。比如RSA非对称加密算法,DES对称加密算法,SHA-1 hash算法。
(4) 浏览器支持的压缩方法。
- 第二次握手(ServerHello)
服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。
(1) 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
(2) 一个服务器生成的随机数,稍后用于生成对称加密算法的"对话密钥"。
(3) 确认使用的各种加密方法,比如确认算法使用:RSA非对称加密算法,DES对称加密算法,SHA-1 hash算法
(4) 服务器证书(注:该证书中包含公共秘钥)。
除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。
- 第三次握手(客户端回应)
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的非对称加密算法的公钥。然后,向服务器发送下面三项信息。
(1) 一个随机数。该随机数用服务器发来的公钥进行的使用非对称加密算法加密,防止被窃听。
(2) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送(比如确认使用:RSA非对称,DES对称,SHA-1 hash算法)。
(3) 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的对称加密算法,各自生成本次会话所用的同一把"会话密钥"。也就是说浏览器和服务器各自使用同一个对称加密算法,对三个相同的随机数进行加密,获得了,用来加密网页内容的 对称加密算法的秘钥。(注意:前两个随机数都是明文的,但是服务端获得的"pre-master key"是密文的,所以服务器需要使用非对称加密算法的私钥,来先解密获得"pre-master key"的明文,在来生成对称加密算法的秘钥。)
- 第四次握手(服务器的最后回应)
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的对称加密算法的"会话密钥"。然后,向客户端最后发送下面信息。
(1)编码改变通知,表示随后的信息都将用双方商定的对称加密算法和密钥进行加密。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。
相关问题
1.为什么要使用三个随机数来生成对称秘钥?
2.为什么要将公共秘钥放在数字证书中?
放在数字证书中保证了该公共秘钥可能会被监听,但是不会被修改。
- 中间人攻击
这是需要CA认证机构颁发证书的原因,如果任何人都可以作为中间人制作证书,那么就会产生中间人攻击,发布证书的中间人将获知通信的所有信息