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?

相关推荐
钟离墨笺2 小时前
Go语言-->切片注意点及理解
java·开发语言·golang
麦麦鸡腿堡2 小时前
Java的数组查找
java·开发语言
用户9446814013503 小时前
JUC CountDownLatch 源码详解
java
杨杨杨大侠3 小时前
手把手教你写 httpclient 框架(九)- 企业级应用实战
java·http·github
七夜zippoe3 小时前
微服务配置中心高可用设计:从踩坑到落地的实战指南(一)
java·数据库·微服务
天天摸鱼的java工程师3 小时前
Java 设计模式(观察者模式)+ Redis:游戏成就系统(条件达成检测、奖励自动发放)
java·后端
忘了ʷºᵇₐ3 小时前
在hadoop中Job提交的流程
java·hadoop
编啊编程啊程3 小时前
Netty从0到1系列之RPC通信
java·spring boot·rpc·kafka·dubbo·nio
召摇3 小时前
Java Web开发从零开始:初学者完整学习指南
java·后端·面试