【Java ee初阶】HTTP(4)

构造HTTP请求

1)开发中,前后端交互。浏览器运行的网页中,构造出HTTP请求

2)调试阶段,通过构造HTTP请求测试服务器

朴素的方案:

通过tcp socket 的方式构造HTTP请求

按照HTTP请求格式,往TCP socket中写入字符串,就能够构造出HTTP请求

package HttpFile;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class HttpClient {private Socket socket = null;//初始化socketpublic HttpClient(String host, int port) {try {socket = new Socket(host, port);} catch (IOException e) {e.printStackTrace();}}//通过get方法发起一个HTTP GET请求public void get(String url) throws IOException  {//构造HTTP结构的字符串try(InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();){String firstLine = "GET " + url + " HTTP/1.1\n";String header = "Host: " + socket.getInetAddress().getHostAddress() +":"+socket.getPort()+ "\n";String blankLine = "\n";String httpRequest = firstLine + header + blankLine;outputStream.write(httpRequest.getBytes());outputStream.flush();//发送出请求之后,还需要读取响应byte[] buffer = new byte[1024+1024];int n = inputStream.read(buffer);String httpResponse = new String(buffer, 0, n);System.out.println(httpResponse);}catch(IOException e){e.printStackTrace();}return ;}public static void main(String[] args) {}
}

想运行测试是有一定困难的,因为目前没有http的服务器。sougou,baidu都是https的服务器(这一直要等到虚了spring,自己写HTTP服务器之后)。这里主要是去理解,HTTP协议的本质就是按照格式构造字符串。

更希望的是构造出HTTPS的请求来访问一些知名的网站,但是通过tcp socket构造非常复杂,然而也有一些现成的库。

Java / Python /C++ 主流的编程语言都提供了这样的库。

HTTPS加密流程详解

 一、HTTPS基础概念

HTTPS(HyperText Transfer Protocol Secure)是HTTP的安全版本,它在传输层和应用层之间加入了SSL/TLS加密层。主要特点包括:

1. 数据加密:防止传输内容被窃听
2. 身份验证:确保通信双方的真实性
3. 数据完整性:防止传输内容被篡改

二、HTTPS加密流程详解

HTTP是明文传输的,因此HTTP并不安全,容易发生“运营商劫持”,如下图

运营商的路由器,搭载一些程序,识别到如果是要获取天天动听的下载地址,那么就篡改成QQ浏览器的下载地址

这就涉及到了“加密”的概念。加密属于密码学,密码学属于数学的分支学科。

其中,比较基础的核心概念:

明文:要传输的原始数据

密文:要保护原始数据,需要对数据进行变化,使其不容易被别人识别出来

明文->密文:加密过程

密文->明文:解密过程

加密解密过程中涉及到一个关键的中间数据:密钥

HTTPS工作过程:(这里不研究加密的具体算法是怎么做到的,因为这是一个比较复杂的数学问题)

1.引入对称加密

生成一个密钥,明文到密文,通过这个密钥进行,而密文到明文,也是通过这个密钥来进行的。此时客户端给服务器发送的就是通过key进行对称加密的密文,黑客就算知道数据是什么,由于他没有密钥,也就无法知道明文。

服务器收到数据之后,使用同样的密钥对数据进行解密。

HTTP协议来说,首航不加密,header和body都进行加密

上述方案是不太可行的。

一个服务器要给很多个客户端提供服务,而服务器和这些客户端通信的过程中,使用的密钥不是同一个。既然每个客户端的密钥都是不同的,得有人生成一个“随机的密钥”来作为这次通信使用,可以是客户端负责生成,也可以是由服务器负责生成。无论是哪一方生成,都需要去通知对方。

客户端负责生成密钥,比如888888(真实的密钥是非常长的一串字符串)

上述的密钥传输,也经过了黑客的设备,黑客也就知道了

问题:需要告诉对方密钥是什么,但是密钥不能明文传输

那么,如果对密钥再进行一次对称加密呢?比如密钥是key,使用另一个密钥key2针对key来进行加密,把key密文传输给对端。

然而,如果不把key2告诉服务器,服务器也就解密不了,拿不到key,如果把key2告诉服务器,又会被黑客获取到。

2.引入非对称加密

非对称加密有两个密钥,这两个密钥其中一个可以公开出去,谁都能获得,是公钥

另一个则不能公开,自己持有,是私钥

比如,使用公钥加密,那就使用私钥解密

如果使用私钥加密,那就使用公钥解密

公钥私钥不是凭空来的,都是数学家们研究出来的,具有一定关系的数据。

对称加密保护数据,本身比较安全的,关键是对称密钥要能安全传输给对方

引入非对称加密的主要目的,就是为了传输对称密钥

为什么不直接那非对称加密去传输数据呢?

因为非对称加密,加密解密的计算成本,远高于对称加密。

公钥私钥,是服务器生成的一个密钥对,私钥服务器自己持有,公钥公开出去,所有人都能获取得到。

客户端就可以使用公钥,对对称密钥进行加密。

当前的数据,到达黑客的设备,黑客没有办法,黑客手里只有公钥,公钥此处是用来加密的,无法进行解密。

服务器拿着私钥解密,获取到对称密钥888888

*黑客为什么不直接入侵服务器,这样不就能拿到私钥了吗

*当然有可能的, 但是存在门槛的。 入侵运营商的设备,大概率是比入侵一个企业的机房要更容易一些。 直接入侵了,不需要监听任何数据,直接拖数据库。 (知名网站被拖库,也不是什么新鲜事了...)

3.中间人共计

黑客是有办法解决刚才那一套方案的 

由于公钥本身就是公开的,不需要加密传输

黑客自己生成了一堆公钥私钥pub2 / pri2

客户端不知道公钥是不是对的,只能选择相信,拿着pub2对堆成密钥888888进行加密。

由于此时数据是通过Pub2加密的,所以黑客就可以拿着pri2对数据解密从而拿到888888.黑客手里拿到了服务器的Pub1公钥,拿着pub1对888888重新进行加密。

服务器拿着Pri1解密,当然解密成功了,服务器拿到了888888.

4.引入证书,通过证书解决中间人共计

证书解决的核心问题,就是让客户端能够识别出当前的公钥,是否是服务器本身创建的,还是黑客伪造的

此时需要引入第三方公正机构,通过公证机构的认证就可以认为公钥是可信的。

证书中结构化数据构成的字符串包含以下属性:

1.证书的发布机构

2.证书的有效期

3.证书的所有者

4.证书对应服务器的地址/域名

5.公钥(服务器生成的pub1 / pri1)

6.数字签名

数字签名是验证证书有效的关键要素!

服务器的开发者需要再公正机构申请证书,提交资质,让对方进行审核。

客户端需要验证证书的合法性,依靠数字签名。

数字签名的生成:

(数字签名,就是加密后的校验和)

公证机构,生成证书之后,针对证书,算一个校验和

公证机构,拿着自己生成的非对称密钥对 (pub3 / pri3)

使用其中的 私钥 pri3 对校验和进行加密,得到了数字签名。

数字签名的验证:

客户端拿到证书之后,需要按照同样的校验和算法,对证书的这些字段 再算一次校验和,得到checksum1 (客户端自己算的)

使用公证机构的 pub3 公钥对证书中的数字签名,进行解密,得到checksum2 (公证机构算的)

如果两者相等,说明证书没有被篡改过,证书中的公钥就是科学的 (服务器原始生成的)

如果黑客篡改了证书中的 公钥,算出来的 checksum1 一定是不等于 checksum2 的

如果不匹配,客户端/浏览器,弹出提示框

对于chrome 弹出 红色的页面 该网站存在风险,是否要继续访问

上述流程中

1) 黑客能否篡改公钥呢?

不能。一旦篡改公钥,checksum对不上,客户端就能识别出来。 

2) 黑客能否自己搞一个证书,整个替换掉服务器返回的证书?

不能 。证书中包含了服务器的 地址/域名 本来访问百度网站,得到的域名,是别人的域名,浏览也很容易识别

3) 黑客是否可以篡改公钥同时,也把数字签名也篡改了呢?

 不能. 数字签名是通过公证机构的私钥来进行加密的,这个私钥,黑客拿不到(黑客无法对自己算的校验和进行正确的加密)

4) 公证机构的公钥如何被客户端拿到? 黑客是否可能伪造公证机构的公钥呢?

不能的! 公证机构的公钥不是通过网络获取的,而是内置在操作系统里的 (当然也可以通过其他途径进行安装)

如果黑客搞了一个有猫腻的系统镜像 (之前第三方的系统镜像,大白菜,老毛桃..... 都可能存在这样的隐患)

fiddler安装的时候,也需要安装一个证书。

fiddler的工作过程,就是在进行中间人攻击。数据是加密的,信任安装fiddler的证书,就是允许fiddler进行中间人攻击。 fiddler使用自己的证书替换掉服务器返回的证书。 fiddler的证书已经被安装信任了,就不会让浏览器报错了。fiddler通过上述中间人攻击,拿到对称密钥,进一步的对所有数据解密 让我们看到抓包结果的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 __main

STM32开发中__main与用户main()函数的本质区别及工作机制 在STM32开发中,__main和用户定义的main()函数是启动过程中的两个关键节点,分别承担运行时初始化和用户程序入口的职责。以下是它们的核心差异及协作机制: 一、定义与层级差异 ​__ma…

什么是PMBus

一、PMBus的定义与背景 PMBus(Power Management Bus,电源管理总线) 是一种基于SMBus(System Management Bus)的开放标准数字通信协议,专为电源设备的监控、配置和控制设计。由PMBus联盟(现并入…

Python OOP核心技巧:如何正确选择实例方法、类方法和静态方法

Python方法类型全解析:实例方法、类方法与静态方法的使用场景 一、三种方法的基本区别二、访问能力对比表三、何时使用实例方法使用实例方法的核心场景:具体应用场景:1. 操作实例属性2. 对象间交互3. 实现特定实例的行为 四、何时使用类方法使…

业务中台-典型技术栈选型(微服务、容器编排、分布式数据库、消息队列、服务监控、低代码等)

在企业数字化中台建设中,业务中台是核心支撑平台,旨在通过技术手段将企业核心业务能力抽象、标准化和复用,以快速响应前端业务需求。其核心技术流涉及从业务抽象到服务化、治理和持续优化的全流程。以下是业务中台建设中的核心技术体系及关键…

期望是什么:(无数次的均值,结合概率)21/6=3.5

https://seeing-theory.brown.edu/basic-probability/cn.html 期望是什么:(无数次的均值,结合概率)21/6=3.5 一、期望(数学概念) 在概率论和统计学中,**期望(Expectation)**是一个核心概念,用于描述随机变量的长期平均取值,反映随机变量取值的集中趋势。 (一…

matlab官方免费下载安装超详细教程2025最新matlab安装教程(MATLAB R2024b)

文章目录 准备工作MATLAB R2024b 安装包获取详细安装步骤1. 文件准备2. 启动安装程序3. 配置安装选项4. 选择许可证文件5. 设置安装位置6. 选择组件7. 开始安装8. 完成辅助设置 常见问题解决启动失败问题 结语 准备工作 本教程将帮助你快速掌握MATLAB R2024b的安装技巧&#x…

第3章 自动化测试:从单元测试到硬件在环(HIL)

在前两章中,我们已完成从环境搭建到流水线编译的自动化配置。为了真正保障软件质量、降低回归风险,本章将聚焦测试自动化,涵盖从最基础的单元测试,到集成测试,再到硬件在环(Hardware-in-the-Loop, HIL)测试的全流程。通过脚本驱动、测试报告可视化和与 CI 平台深度集成,…

信息收集+初步漏洞打点

目标:理解信息收集在渗透测试中的意义,熟悉常用工具用法,完成基本打点测试 一.理论学习: 模块内容说明信息收集分类主动信息收集 vs 被动信息收集目标发现子域名、IP、端口、子站点、目录、接口技术指纹识别Web框架(如…

uniapp+vue3开发项目之引入vuex状态管理工具

前言: 我们在vue2的时候常用的状态管理工具就是vuex,vue3开发以后,又多了一个pinia的选项,相对更轻便,但是vuex也用的非常多的,这里简单说下在uni-app中vuex的使用。 实现步骤: 1、安装&#x…

浅谈“量子计算应用:从基础原理到行业破局”

量子计算应用:从基础原理到行业破局 引言:量子计算为何成为科技革命新引擎? 量子计算利用量子力学原理(叠加态、纠缠态、量子干涉)突破经典计算的极限,在特定领域可实现指数级加速。根据中研普华预测,2025年全球量子计算市场规模将突破80亿美元,2035年可达8117亿美元。…

UNiAPP地区选择

<template> <view class"container"> <!-- 左侧地区列表 --> <scroll-view class"left-list" scroll-y :scroll-into-view"currentLetterId" scroll-with-animation scroll"…

嵌入式硬件篇---CAN

文章目录 前言1. CAN协议基础1.1 物理层特性差分信号线终端电阻通信速率总线拓扑 1.2 帧类型1.3 数据帧格式 2. STM32F103RCT6的CAN硬件配置2.1 硬件连接2.2 CubeMX配置启用CAN1模式波特率引脚分配过滤器配置&#xff08;可选&#xff09; 3. HAL库代码实现3.1 CAN初始化3.2 发…

DeepSeek-R1 Supervised finetuning and reinforcement learning (SFT + RL)

DeepSeek-R1Supervised finetuning and reinforcement learning (SFT RL) 好啊&#xff0c;我们今天的直播会非常透彻的跟大家系统性的分享一下整个agents AI就大模型智能体系统和应用程序。我们在做开发的时候&#xff0c;或者实际做企业级的产品落地的时候&#xff0c;你必…

机器学习 day04

文章目录 前言一、线性回归的基本概念二、损失函数三、最小二乘法 前言 通过今天的学习&#xff0c;我掌握了机器学习中的线性回归的相关基本概念&#xff0c;包括损失函数的概念&#xff0c;最小二乘法的理论与算法实现。 一、线性回归的基本概念 要理解什么是线性回归&…

img.dims() <= 2 in function ‘cv::matchTemplate报错

Mat src mat_ori;//imread(img_original);Mat src_template imread(img_template);cvtColor(src, src, COLOR_BGR2RGB);//不转换&#xff0c;matchTemplate将报错cvtColor(src_template, src_template,COLOR_BGR2RGB);//不转换&#xff0c;matchTemplate将报错 error: (-215…

NY321NY322美光闪存芯片NY323NY336

NY321NY322美光闪存芯片NY323NY336 在存储技术飞速发展的今天&#xff0c;美光科技的闪存芯片凭借其创新架构与高性能表现&#xff0c;已成为工业自动化、智能终端等领域的核心组件。本文将围绕技术解析、产品评测、行业趋势、应用案例及市场动态五大维度&#xff0c;深入探讨…

exit耗时高

背景&#xff1a;程序退出发现被强制退出&#xff0c;而不是正常的退出。正常退出是发送15信号&#xff0c;而异常退出是发送信号9&#xff0c;强制退出。退出机制是先发送信号15&#xff0c;然后6s内没有退出完成&#xff0c;会发送信号9。通过查看退出流程&#xff0c;是将初…

docker compose up -d 是一个用于 通过 Docker Compose 在后台启动多容器应用 的命令

docker compose 表示调用 Docker Compose 工具&#xff0c;用于管理基于 YAML 文件定义的多容器应用。 up 核心指令&#xff0c;作用是根据 docker-compose.yml 文件中的配置&#xff0c;创建并启动所有定义的服务、网络、卷等资源。 如果容器未创建&#xff0c;会先构建镜像&…

从辅助到协作:GitHub Copilot的进化之路

如果说现代程序员的标配工具除了VS Code、Stack Overflow之外&#xff0c;还有谁能入选&#xff0c;那一定是GitHub Copilot。从2021年首次亮相&#xff0c;到如今深度集成进开发者日常流程&#xff0c;这个“AI编程助手”已经不只是写几行自动补全代码的小帮手了&#xff0c;而…

局部放大maya的视图HUD文字大小的方法

一、问题描述&#xff1a; 有网友问&#xff1a;有办法局部放大maya的字体吗比如hud中currenttime打开之后画面右下角有个frame 想放大一下能做到吗&#xff1f; 在 Maya 中&#xff0c;可以通过自定义 HUD&#xff08;Heads-Up Display&#xff09;元素的字体大小来局部放大特…