Java HTTP协议(二)--- HTTPS,Tomcat

文章目录

HTTPS

  1. HTTPS主要就是把HTTP进行加密
    明文 + 密钥 -> 密文
    密文 + 密钥 -> 明文
  2. 在密码学中,使用密钥进行加密,有两种主要的方式
    1.对称加密。加密和解密,使用的密钥是同一个密钥

设密钥为key

明文 + key -> 密文

密文 + key -> 明文

加密和解密这里是数学上的问题

2.非对称加密,有两个密钥(一对)

这两个密钥,一个称为公钥,一个称为私钥

(公钥就是可以公开的,私钥就是自己藏好的)

明文 + 公钥 -> 密文

密文 + 私钥 -> 明文

明文 + 私钥 -> 密文

密文 + 公钥 -> 明文

用一个钥匙加密,就用另一个钥匙解密

举个例子:

HTTPS的工作过程

  1. 目标:针对HTTP这里的header和body进行加密

对称加密和非对称加密

1.先引入对称加密

上面的模型存在一个重要的问题。服务器不是只和一个客户端通信,而是和很多客户端通信。

这些客户端使用的对称密钥是相同的吗?

很明显,必须要求每个客户端的密钥都是不同的,彼此之间才不知道对方的密钥是啥

如果都是相同的话,那么黑客搞一个客户端服务器的请求,把你的密钥获取到,这些数据不都全都知道了吗

问题:


针对以上情况就,如何让密钥更安全地到达服务器呢???
需要针对秘钥进行加密

那是否要再搞一个密钥2,使用密钥2对上面的密钥进行加密呢?

(此时,还要想办法把秘钥2也传输给服务器)无论引入多少个密钥,你套上几层娃,都有泄露的风险,这种方法就不行了

  1. 为了解决上述安全传输秘钥的问题,引入了 非对称加密
    非对称加密中,有一对密钥,公钥和私钥。
    可以使用公钥加密,私钥解密
    或者使用私钥加密,公钥解密

过程:服务器这里有公钥和私钥,把公钥传给客户端,虽然中间可能会被黑客截获公钥,但是黑客没有私钥,是解锁不了的,然后客户端进行对密文,公钥的加密,再发给服务器,黑客还是没有私钥,所以还是解锁不了


既然已经引入了非对称加密,为啥还需要引入对称加密呢?

直接使用非对称加密,来完成所有的业务数据的加密传输即可。

进行非对称加密/解密,运算成本是比较高的。运算速度也是比较低的。对称加密,运算成本低,速度快

使用非对称加密,只是用来进行这种关键环节(传输秘钥)(一次性的工作,体积也不大),成本就比较可控。后续要传输大量的业务数据,都使用效率更高的对称加密,是比较好的做法。

如果业务数据都使用非对称加密,整体的传输效率就会大打折扣了。

引入安全性,引入加密,也势必会影响到传输效率,我们也是希望这样的影响能够尽可能降到最低!

中间人攻击

上述对称加密 + 非对称 加密过程就是HTTPS基本盘 了。但是只有这些是不够的,上述流程中还存在一个严重的漏洞 ,黑客如果利用好这个漏洞,仍然可以获取到原始的明文数据!!!

举个中间人攻击 的例子:

中间人攻击的过程:

如何解决上述的中间人攻击呢?
之所以能进行中间人攻击,关键要点在于客户端没有分辨能力。客户端不知道当前这个公钥是不是黑客伪造的!!!

这里的分辨,不能靠自证(谁都说自己是真的)

引入第三方的可以被大家都信任的公证机构,公证机构说这个公钥是正确的,不是伪造的,我们就是可以信任的!!!

基本过程:

对于证书,数字签名如何加密的理解:

对校验和进行计算,验证是否是正确的公钥

本来是拿服务器的公钥算的效验和,放入到数字签名中,如果黑客替换了公钥计算出的效验和,就和客户端通过内置的公证机构的公钥进行解密拿到效验和,就不一样了,那么就不是原始的公钥了

黑客无法直接替换公钥:

黑客可以直接重新计算一个数字签名,可以吗?

黑客是否可以自己也申请一个证书,完全替换掉,服务器的证书呢???
这是行不通的,申请证书,需要提交资料。其中就有网站的主域名,认证机构自然会认证这个域名是否是你所有的了(难道你可以拿着别人的域名说是自己的吗)

HTTPS过程的总结

面试中经典的面试题

https加密:

(1) 对称加密,加密业务数据

(2) 非对称加密,加密对称密钥

(3) 中间人攻击

(4) 使用证书,来验证服务器的公钥

这些相结合,就保证了https的安全性

Tomcat

  1. Tomcat:HTTP服务器
    使用HTTP进行通信,就需要涉及到HTTP客户端和HTTP服务器

HTTP客户端 :浏览器,Postman,爬虫程序
HTTP服务器 :可以自己写代码实现(基于 TCP socket)

但是实际上一般来说在开发过程中不需要我们从头开始去写,有一些大佬们,已经写好了现成的http服务器,我们只需要去使用或者基于这些http服务器进行二次开发即可

二次开发 :人家的代码已经把如何处理http请求,如何构造http响应都封装好了。我们只需要调用这些api来构造我们的业务逻辑即可

业务逻辑:你开发的网站是干什么的。比如:博客网站,外卖网站,电商网站

  1. Tomcat是Java中最流行的HTTP服务器

    这里贴一个Tomcat的下载教程:下载教程

  2. Tomcat 是一个Java写的http的服务器

    开发网站,就需要涉及到HTTP服务器。
    bin目录下放的是tomcat的一些相关可执行脚本

启动Tomcat程序:

Tomcat闪退的原因:

可以通过日志确认Tomcat是跑起来的,还可以把Tomcat启动之后,就可以通过浏览器来访问tomcat的欢迎页面了

tomcat的日志,在控制台中,可能是乱码

原因:

Tomcat默认使用的字符集,是utf8

而windows cmd 的字符集是gbk

要么把tomcat改成gbk,要么把cmd改成utf8

这里就不处理了,后续还会介绍其他使用tomcat的方式,比如把tomcat集成到idea中,或者linux中使用tomcat,这两种后面主要使用的方式不会乱码

  1. conf中放的是tomcat的配置文件
    我们程序员一般都是通过配置文件的方式来进行设置的这些功能(一个程序的功能可能是多种多样的)
    tomcat的配置主要是通过xml的方式来提供的
  2. logs,日志,调试一个服务器程序最重要的手段,后续自己写程序的时候,代码中打印的日志,就可以再上述目录中看到

    日志和调试器:
    日志,就是通过System.out.println等方式打印的一些字符串
    调试器:打断点,单步执行

调试器不适合给服务器程序使用,给程序打断点,停下来了(服务器就卡着了),此时此刻,其他客户端的请求可能就无法被响应了。经常也涉及到 概率性问题 。100个请求,才触发一次的问题。

使用调试器,本质上是:

1.更好地理解程序的实际执行过程

2.更好得关注到某些临时结果(某个变量的中间的值)

这两点都可以通过日志代替

包括一些算法题,也可以使用日志

使用日志的缺点:

使用日志调试,每次添加/改动日志,都需要重新编译运行

如果一次编译需要1个小时呢?
IO多路复用

  1. webapps里面放的就是诺干个webapp(网站)

webapps中,每个目录,都是一个webapp(就包含了一个网站的后端代码和前端代码)

.war包的生成:

Tomcat的作用

  1. 通过一个简单的例子,感受一下,tomcat的作用

    需要云服务器,大家才能访问我的网页

    Tomcat就像是一个底座一样,我们所编写的网站,都是要架到这个底座上,然后才能被外面的用户顺利访问到,Java是这么做的,其他编程语言还有别的玩法

静态网页和动态网页

  1. 刚才只是在tomcat上放了一个静态网页,实际上tomcat还能支持动态网页,这样就有更复杂的逻辑,有功能就更强大的页面
  2. 静态页面:页面内容都是固定的
    比如一个搜索的网页,百度
  3. 动态页面:根据用户输入的内容不同,产生出不同的结果

有明显的输入:

比如在百度搜索两个不同的关键词,得到的页面结果是不同的

虽然内容不同,但是页面结构非常相似。就像一个模子里刻出来的一样

无明显的输入:
有的页面虽然用户没有明显的输入,但是也有差异,也是动态页面

比如B站,主页给你推荐的内容,不同的用户的页面就是不同的。很多网站会根据用户的历史操作,来推测用户的喜好,进一步给用户推荐他感兴趣的内容

什么是Servlet?

相关推荐
枫叶落雨2221 天前
ShardingSphere 介绍
java
花花鱼1 天前
Spring Security 与 Spring MVC
java·spring·mvc
言慢行善1 天前
sqlserver模糊查询问题
java·数据库·sqlserver
专吃海绵宝宝菠萝屋的派大星1 天前
使用Dify对接自己开发的mcp
java·服务器·前端
大数据新鸟1 天前
操作系统之虚拟内存
java·服务器·网络
Tong Z1 天前
常见的限流算法和实现原理
java·开发语言
凭君语未可1 天前
Java 中的实现类是什么
java·开发语言
He少年1 天前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
克里斯蒂亚诺更新1 天前
myeclipse的pojie
java·ide·myeclipse
迷藏4941 天前
**eBPF实战进阶:从零构建网络流量监控与过滤系统**在现代云原生架构中,**网络可观测性**和**安全隔离**已成为
java·网络·python·云原生·架构