目录
2. 你认为https绝对安全吗?如果不,用什么办法让它安全?
1. 叙述https的过程,以及其中用到的加密算法?
1.1 过程
HTTPS协议 = HTTP协议 + SSL/TLS协议,在https数据传输的过程中,需要使用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输。
1)客户端选择一套浏览器支持的加密算法(对称加密、非对称加密、哈希算法和数字签名)发送https请求到服务器(默认端口为443)
2)服务器以证书的形式返回客户端,客户端检测证书合法性并结合证书公钥发送给服务器
3)服务器使用私钥解密,验证哈希,加密响应信息后返回客户端
4)客户端进行解密响应,验证信息的真伪,然后进行数据交互
https的加密算法:
1)对称加密:有流式、分组两种,加密和解密都是使用的同一个密钥,算法性能较好,但是安全性较低
2)非对称加密:加密使用的密钥和解密使用的密钥不同,分别为公钥和私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能低,安全性超强,加密数据长度有限
3)哈希算法:将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,并且算法不可逆
4)证书签证:签名就是在经过hash算法后的信息后面加上一段内容,证明信息没有被修改过。
2. 你认为https绝对安全吗?如果不,用什么办法让它安全?
https不是绝对安全的,因为一般浏览器默认在输入域名时,发送给服务器的是http请求,然后服务器在返回重定向响应指定到https请求,在此过程中,http请求过程中数据是暴露出来的,容易被被人劫持。
解决办法:
使用HSTS可以让浏览器自己使HTTP转换为HTTPS,而不是服务器对地址进行重定向操作,只要在服务器返回给浏览器的响应头中,增加Strict-Transport-Security
语法如下:Strict-Transport-Security: <max-age=>[; includeSubDomains][; preload]
3. 叙述重定向状态码304?
定义:如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个304状态码。简单的表达就是:服务端已经执行了GET,但文件未变化。
目的:这个功能是为了提高网站的访问速度,当你发出一个GET请求的时候服务器会从缓存中调用你要访问的内容,这个时候服务器就可以判断这个页面是不是更新过了,如果未更新过那么他会给你返回一个304状态码。
过程:客户端请求文件若发现文件有Last Modified,则请求中会包含字段If Modified Since来缓存文件Last Modified,说明客户端有缓存,服务器只要判断这个时间值和当前请求文件修改的时间就可以确定是否返回304或者200。
例如:一般在请求静态资源时,服务器会自动完成Last Modified 和 If Modified Since 的比较。
因此,对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。虽然在返回 304 的时候已经做了一次数据库查询,但是可以避免接下来更多的数据库查询,并且没有返回页面内容而只是一个 HTTP Header,从而大大的降低带宽的消耗,对于用户的感觉也是提高。
如何阻止返回304:
- 设置浏览器禁止缓存
- 在每个请求中添加Pragma: no-cache请求头,在每个响应中添加Cache-Control: no-cache响应头,阻止浏览器缓存这些资源