侧边栏壁纸
博主头像
快乐江湖的博客博主等级

更多内容请点击CSDN关注“快乐江湖”

  • 累计撰写 127 篇文章
  • 累计创建 33 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

第三章Java网络编程-第五节:HTTP协议和HTTP请求构造

快乐江湖
2023-08-30 / 0 评论 / 0 点赞 / 4 阅读 / 40193 字

注意:本文主要内容是HTTP协议和Java中的HTTP请求构造相关内容,对于HTTP协议部分内容不会清晰阐述,有兴趣的读者可参照本人专栏《湖科大教书匠教书匠计算机网络》进行学习,这里重点介绍一些实操内容

一:HTTP协议

借助第六章应用层-第五节:万维网和超文本传输协议(HTTP)

二:HTTP请求构造

(1)通过FORM表单构造

通过FORM表单构造:指的是使用 HTML 的表单元素构造一个 HTTP 请求。表单元素是 HTML 中用于收集用户输入信息并将其发送到服务器的一种机制,可以通过表单元素构造 HTTP GET 或 POST 请求,用于与服务器进行交互

  • 在表单中使用 GET 请求时:浏览器将收集表单中的数据并将其作为查询字符串附加到 URL 上,发送给服务器。在这种情况下,请求的头部中不包含 Content-Type 属性,因为请求没有正文
  • 在表单中使用 POST 请求时:浏览器将收集表单中的数据并将其封装为一个 HTTP 请求发送到服务器。表单中的每个输入元素都将作为请求的参数,包含在请求的正文中。请求的头部中包含 Content-Type 属性,用于指定请求正文的类型(通常为 application/x-www-form-urlencodedmultipart/form-data

表单元素可以通过各种输入控件来实现,如输入框、下拉列表、单选按钮和复选框等。在提交表单时,浏览器会将每个输入元素的值与其名称一起作为键值对发送到服务器,服务器收到请求后可以解析这些键值对以获取输入数据

以下是一个使用FORM表单对百度发送get请求的示例,当用户点击提交按钮时会将HTTP请求发送给服务器

  • form
    • action:构造的HTTP请求的URL
    • method:构造方法,只能选择getpost
  • input
    • type:输入框类型,用户输入的内容是HTTP请求键值对中的“值”
    • name:HTTP请求键值对中的“键”
    • value:input标签的值
<form action="https://www.baidu.com", method="get">  
    <input type="text", name="aa">  
    <input type="text", name="bb">  
    <input type="submit", name="提交">  
</form>

对于上面内容,当点击提交后,浏览器就会把这个HTTP请求发送出去

接着我们把上面的get方法改为post,然后提交

<form action="https://www.baidu.com", method="post">  
    <input type="text", name="aa">  
    <input type="text", name="bb">  
    <input type="submit", name="提交">  
</form>

你会发现在地址栏中并未出现我们请求中的键值对

通过抓包工具可以截获

(2)通过ajax构造

A:什么是ajax

ajax:是一种使用前端 JavaScript 技术向服务器发送异步请求并更新网页内容的技术。Ajax 可以在不刷新整个页面的情况下,向服务器请求数据并动态更新网页上的某些部分。Ajax 通过使用 XMLHTTP 请求对象实现与服务器的数据交互。当用户触发某些事件(如点击按钮)时,Ajax 将使用 XMLHttpRequest 对象向服务器发送请求,服务器将处理请求并返回数据。在服务器返回数据之后,Ajax 可以通过 JavaScript 将返回的数据插入到页面的某个元素中,实现页面内容的更新。由于 Ajax 请求是异步的,因此网页可以在等待服务器响应的同时继续响应用户的交互

Ajax 的主要作用是提高用户体验和网站的性能。使用 Ajax 可以使网页更加动态、实时,减少不必要的页面刷新,从而提高网站的性能和响应速度。Ajax 还可以与服务器进行交互,获取或提交数据,使网站更加交互和智能化。Ajax 技术被广泛应用于各种 Web 应用程序中,包括社交媒体、电子商务、在线游戏和协作工具等

ajax api浏览器原生自带,但是不是很好用,所以这里可以使用第三方库,利用封装好的api代替原生的api,这里使用jQuery。在代码中利用网络地址引入jQuery

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>

B:利用ajax构造HTTP请求

基本构造方法如下,更多细节需要在具体项目代码中讲解

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Title</title>  
</head>  
<body>  
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>  
<script>  
    // $是jquery中特殊的变量名,是jquery里面的全局对象  
    // 通过这个对象就可以调用里面的一些方法,这些方法就是jquery的api  
    $.ajax({  
        type: 'post',  
        url: 'https://www.baidu.com',  
        data: '如果是post,则这就是请求的body',  
        contentType: 'x-www-form-urlencoded',  
        success: function (body) {  
            // 正确响应200,参数body是响应的正文  
            console.log("ok");  
        },  
        error: function () {  
            // 错误响应  
            console.log("error");  
        }  
    });  
</script>  
</body>  
</html>

三:HTTPS协议

(1)什么是HTTPS

HTTPS:是一种用于在网络上进行安全通信的协议。它是HTTP协议的安全版本,通过使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议对通信进行加密和认证,确保传输的数据在客户端和服务器之间是私密和完整的。HTTPS协议关键特点如下

  • 加密:HTTPS使用加密算法来对传输的数据进行加密。这样,即使被第三方截获了传输的数据,也无法读取其中的内容,因为加密后的数据只能由服务器解密
  • 身份验证:HTTPS通过使用数字证书来验证服务器的身份。数字证书由受信任的证书颁发机构(CA)签发,用于证明服务器的真实性和可信度。这样,客户端可以确保其与服务器建立的连接是与预期的服务器建立的,防止中间人攻击
  • 数据完整性:HTTPS使用消息认证码(MAC) 来验证传输的数据是否完整和未被篡改。MAC是通过使用密钥对数据进行哈希运算得到的,接收方可以使用相同的密钥来验证数据的完整性
  • 端口号:HTTP默认使用80端口进行通信,而HTTPS默认使用443端口进行加密通信。这样,客户端和服务器之间的通信可以明确地指定为安全通信,避免了潜在的混淆和冲突

(2)关于加密

既然要保证数据安全, 就需要进行 “加密”。网络传输中不再直接传输明文了, 而是加密之后的 “密文”.。加密的方式有很多,但是整体可以分成两大类:对称加密 和 非对称加密

A:对称加密

对称加密:是一种加密算法,也称为共享密钥加密。在对称加密中,同一个密钥(也称为密钥)用于加密和解密数据。这意味着发送方和接收方需要共享同一个密钥以实现安全通信

  • 加密和解密使用相同的密钥:对称加密使用相同的密钥来加密和解密数据。发送方使用密钥对数据进行加密,接收方使用相同的密钥对密文进行解密以恢复原始数据
  • 快速和高效:对称加密算法通常非常快速和高效,因为加密和解密过程使用的是相同的密钥和算法。这使得对称加密在处理大量数据时非常有优势
  • 密钥管理:对称加密需要确保密钥在发送方和接收方之间的安全传输和存储。如果密钥被第三方获取,数据的安全性将受到威胁。因此,安全地管理和分发密钥对于对称加密的有效使用至关重要
  • 数据机密性:对称加密保证了数据的机密性,使得未经授权的用户无法解密和理解加密的数据。只有拥有正确密钥的接收方才能成功解密并读取数据
  • 适用性:对称加密广泛应用于许多领域,包括文件加密、网络通信、数据库安全等。常见的对称加密算法包括DES(Data Encryption Standard)、AES(Advanced Encryption Standard)和3DES(Triple Data Encryption Standard)等

最简单的对称加密就是“按位异或”:假设明文a=1234,密钥key=8888,则加密a ^ key得到密文b=9834,解密时再次运算b ^ key,即可恢复明文1234

引入对称加密后,一个理想化的加密通信模型如下图所示

此时,即使数据被黑客截获,但由于不知道密钥是什么,所以也无计可施。但事情远远没有这么简单,服务器需要给多个客户端提供服务,对于这些客户端它们所使用的密钥也必须是不同的(如果是相同的则很容易造成扩散)。因此服务器需要维护每个客户端和其对应密钥之间的关系

比较好的一个做法是在客户端和服务端建立连接的时候才确定它们的密钥,所以需要把密钥传输过去

但这又存在问题,因为密钥有可能也会被截获,所以密钥也需要被加密。但这样一来,就永远无法解决问题了,因为不管怎么加密,都需要一个明文传输的环节。所以需要引入非对称加密

B:非对称加密

非对称加密:是一种加密算法,也被称为公钥加密。在非对称加密中,使用一对密钥来加密和解密数据,其中一个是公钥,另一个是私钥。公钥可用于加密数据,而私钥用于解密数据

  • 公钥和私钥:非对称加密使用一对密钥,其中一个是公钥,另一个是私钥。公钥可以公开分享给其他人,用于加密数据。私钥必须保密,并且只有密钥的所有者可以使用它来解密数据。
  • 加密和解密使用不同的密钥:与对称加密不同,非对称加密使用不同的密钥进行加密和解密。数据加密使用接收方的公钥,而数据解密则需要接收方的私钥。这样,即使公钥被公开获取,也无法通过公钥推导出私钥,从而保证了数据的安全性。
  • 安全性和认证:非对称加密不仅提供了数据的机密性,还提供了身份验证和数据完整性的功能。发送方可以使用接收方的公钥加密数据,确保只有持有相应私钥的接收方可以解密数据。此外,私钥的所有者可以使用其私钥对数据进行数字签名,验证数据的完整性和发送方的身份。
  • 密钥管理:非对称加密中的公钥可以公开分发,而私钥必须保持私密。密钥的生成、存储和分发需要特殊的注意,以确保私钥不被未授权的人获取。
  • 计算复杂性:与对称加密相比,非对称加密算法通常更为复杂,计算量更大。这意味着加密和解密的过程可能比对称加密慢得多。因此,在实际应用中,通常将非对称加密与对称加密结合使用,以实现更高效的加密和解密操作

公钥和私钥是配对的,可以正着用,也可以反着用

  • 正着用
    • 通过公钥对明文加密, 变成密文
    • 通过私钥对密文解密, 变成明文
  • 反着用
    • 通过私钥对明文加密, 变成密文
    • 通过公钥对密文解密, 变成明文

非对称加密的数学原理比较复杂, 涉及到一些数论相关的知识。这里举个例子:A 要给 B 一些重要的文件, 但是B可能不在。于是 A 和 B 提前做出约定。B 说:我桌子上有个盒子,,然后我给你一把锁, 你把文件放盒子里用锁锁上,,然后我回头拿着钥匙来开锁取文件。在这个场景中, 这把锁就相当于公钥, 钥匙就是私钥. 公钥给谁都行(不怕泄露),但是私钥只有 B 自己持有。持有私钥的人才能解密

因此,客户端就可以先从服务器拿到服务器的公钥,然后使用公钥对自己生成的对称密钥进行加密。此时由于,外界只有公钥,私钥只是服务器私有,黑客无法获取,所以只有服务器可以使用私钥对其进行解密

(3)关于证书

  • 中间人攻击:是一种网络攻击方式,攻击者试图在通信的两端之间插入自己,以获取或篡改通信的内容

证书:安全证书在防止中间人攻击方面起到了重要作用。通过使用安全证书,可以有效地防止中间人攻击

  • 身份验证:安全证书通过使用数字签名和加密技术,能够验证通信双方的身份。证书由受信任的第三方机构颁发,该机构对通信实体进行了身份验证。这样,接收方可以确保其与预期的通信方建立连接,而不是被中间人拦截和伪装的攻击者
  • 公钥传输:在非对称加密中,使用公钥对数据进行加密。安全证书包含了公钥的信息,并且由证书颁发机构进行数字签名。当接收方获取证书时,可以验证数字签名的有效性,并获得正确的公钥。这确保了公钥的完整性和正确性,防止了中间人篡改公钥的风险
  • 密钥交换:在使用对称加密进行通信时,需要安全地交换密钥。通过使用安全证书,可以实现安全的密钥交换。证书中包含了公钥,用于加密对称密钥,从而只有持有相应私钥的接收方可以解密并获取密钥。这种方式防止了中间人窃取密钥的风险

这个证书就好比人的身份证, 作为这个网站的身份标识. 搭建一个 HTTPS 网站要在CA机构先申请一个证书,可以理解成是一个结构化的字符串, 里面包含了以下信息

  • 证书发布机构
  • 证书有效期
  • 公钥
  • 证书所有者
  • 签名

当客户端获取到这个证书之后, 会对证书进行校验(防止证书是伪造的)

  • 判定证书的有效期是否过期
  • 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构)
  • 验证证书是否被篡改::从系统中拿到该证书发布机构的公钥, 对签名解密, 得到一个 hash 值(称为数
    据摘要), 设为 hash1。然后计算整个证书的 hash 值, 设为 hash2. 对比 hash1 和 hash2 是否相等.
    如果相等, 则说明证书是没有被篡改过的

0

评论区