【网络原理10】构造HTTP请求、HTTPS加密

文章介绍了如何构造HTTP请求,包括使用form表单和基于AJAX的方式,以及它们的优缺点。接着详细讲解了HTTPS的加密机制,包括对称加密和非对称加密,以及解决中间人问题的证书机制,并涉及到跨域访问的问题。最后,文章提到了jQuery框架下实现AJAX请求的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、构造HTTP请求

①使用form表单构造HTTP请求:

form表单是如何提交的

form提交的缺点 

②基于ajax构造http请求

如何使用Jquery框架 

 二、HTTPS

 运营商劫持(有时候也叫做DNS攻击)

HTTP的加密版本:HTTPS

     ①对称加密:客户端和服务端使用同一把密钥,既可以加密,也可以解密

     ②非对称加密:有两个密钥,分别是公钥和私

      中间人问题

      解决"中间人问题"——引入证书

HTTPS的TLS握手过程

‌客户端问候(Client Hello)‌:

服务器问候(Server Hello)‌:

‌服务器密钥交换和证书请求(Server Key Exchange and Certificate Request)‌:

客户端证书和密钥交换(Client Certificate and Key Exchange)‌:

完成握手(Finish Handshake)‌:

‌安全通信(Secure Communication)‌:


一、构造HTTP请求

①使用form表单构造HTTP请求:

<form action="https://www.baidu.com" method="post">

</form>

  在html页面当中,form表单的action部分就是需要提交的url地址。还有一个属性,就是method。

  这个method指定了当前的请求是使用什么方法来提交。

  如果指定的方法为get:那么就是在queryString当中把参数通过url地址栏提交到服务器。

  如果指定的方法为post:那么就是在HTTP请求头的body当中把参数提交到服务器。

  在form表单提交的方式当中,method一栏要么是get,要么是post,不可以是其他的方法。


form表单是如何提交的

   需要使用input标签,并且指定name属性,name属性作为提交的key,type随意

   最后一个input,type需要设置为"submit"。

 如果使用post方法来提交,那么就看不到url地址栏当中的内容了。

 如果使用get方法来提交,那么就可以看到url当地的内容。下面,使用get方法提交一下看看

 

form提交的缺点 

一旦点击了submit按钮提交数据,那么一定会造成页面跳转,也就是页面的刷新。

但是,如果只想提交一部分的内容,实现局部页面的刷新,那就没办法做到了。因此引入了第二种方式:基于ajax请求来提交。


②基于ajax构造http请求

 ajax的全称是:Asynchronous Javascript And XML

 Asymchronized的含义是:异步等待。

首先:浏览器构造一个http请求出来,提交给服务器

由于不确定服务器什么时候给响应,于是就先不管了,继续执行其他的代码。

服务器处理完成请求之后,通知浏览器,来执行http响应


如何使用Jquery框架 

      下面,引入jquery来实现一下构造ajax请求。在浏览器当中输入如下的网址:

       https://code.jquery.com/jquery-3.6.3.min.js

       然后,在idea当中新建一个js文件,命名任意。此处我的命名是Jquery.js。

       把上述网站打开之后的内容复制、黏贴到这个js文件当中,就可以在idea当时的html文件内使用jquery框架了。

下面,书写一下代码:其中:url的资源确实存在

<script>
    $.ajax({
        //指定方法
        type:'get',
        //指定提交的URL
        url: "https://www.sogou.com/index.html",
        //这就是"回调函数"
        success: function (body){
           //在正确获取到HTTP响应之后,来调用
            console.log("获取到了响应:"+body)
        },
        error: function (){
            console.log("获取响应失败")
        }
    });
</script>

  但是,当运行这个页面,然后按住fn+f12查看开发者工具包的时候,就会看到下面的内容:

       出现这个报错的主要原因是:ajax不允许跨域访问。

       当前的页面,是在我的电脑当中的一个文件当中的。

       但是访问的路径:https://www.sougou.com/ index.html这个页面所在的域名(云服务器的IP地址)跟我的电脑所处的域名,并不是同一个。

        以上操作,就出现了跨域。 


 二、HTTPS

 HTTPS其实就是HTTP的安全版本。在HTTPS之前,首先要提一下什么是运营商劫持。

 运营商劫持(有时候也叫做DNS攻击)

       我们都知道,我们使用的路由器等等这些的设备,都是由运营商提供的。也就是通过网络发送消息的时候,一定需要经过这些设备。因此,这些运营商就很有可能把请求的内容给篡改了。

      可以看到,运营商路由器把用户的请求给改了。而改的一切原因,都是设备A给的money比设备B给的多...造成了恶行竞争...

       既然设备要用运营商的,那没办法,也只能用。但是,有没有办法,可以阻止运营商篡改呢?有!那就是引入https的加密,让用户的请求由明文转化为密文,也就是https的加密过程。


HTTP的加密版本:HTTPS

       之前的HTTP是明文传输的,非常容易被获取,也非常容易被篡改。但是,HTTPS就是加密之后的数据。即使篡改了,也没有用。

       HTTPS引入的加密层是SSL(旧版本)或者TLS(新版本)

      下面,将主要介绍SSL的这种加密方式:


     ①对称加密:客户端和服务端使用同一把密钥,既可以加密,也可以解密

      就好像一个密室只有一个门,进出都只有一条路可以走一个道理。

      客户端在网络传输之前,把明文的请求通过密钥转化为密文,然后传输到网络上面。

      服务端在收到了密文请求之后,接下来就是根据刚才的密钥解密,拿到明文。

那么,上述的过程,是如何保证客户端和服务器使用的是同一个密钥呢? 

实际的开发当中,一个服务器往往是同时被很多个客户端同时访问的。

       显然,必须是不同的客户端对应不同的密钥,才说得过去。

       但是,如果约定客户端使用的必须是同一把密钥,又存在一个问题:黑客自己也创建一个客户端。这样就可以得知密钥的加密、解密方式了。

       于是又引入了一个新的方式:每一个客户端在传递信息的时候,顺便把密钥也传输过去。

       但是,如果这个中间的设备已经提前被黑客入侵了。那么,密钥是什么,无论明文还是密文传输,也就很容易被黑客破解了...因为黑客总是可以想方设法获取到你想传递的信息。         即使对于密钥也进行了加密处理,但是客户端也要给服务器传递如何破解密钥的方式,这样也就照样无效。即使加密N层,依然无法解决根本问题。


     ②非对称加密:有两个密钥,分别是公钥和私

      主要作用就是针对对称密钥加密。 

      公钥:就是人人都可以获取到的一把密钥。

      私钥:就是只有自己(单独客户端或者单独服务器)才可以获取的一把钥匙。

      可以使用公钥加密,私钥解密。也可以使用私钥解密,公钥加密。


       基于非对称加密:

       服务器自己生成一对公钥、私钥公钥发出去(每个客户端都可以拿到),私钥保存在服务器当中;

       客户端生成一个对称密钥,然后客户端使用服务器发送的公钥。对于客户端生成的对称密钥进行加密,加密之后传送给服务端。服务器通过私钥进行解密。

       图解一下上述的过程:

  以上的过程,看似可以防止黑客获取数据。但是,仍然存在一个问题,就是:


      中间人问题

       所谓中间人问题,就是黑客在步骤2的时候,获取到了服务器发送的public key。然后,黑客也模仿服务器一样,生成public key2private key2两个key。

       然后把原来服务器发送的public key替换成public key2,发送给客户端。

       客户端于是就使用public key2来加密自己的对称密钥

       当客户端返回数据给服务端的时候,又经过了被黑客攻击的路由器。由于用户是使用public key2进行加密的,因此黑客可以使用private key2破解出客户端的密文。

        然后黑客为了隐藏自己。在传输数据回服务端的时候,重新把public key2改成原来的public key

        图解:        


      在上述的过程当中,客户端识别到了一个虚假的服务端

      那么,怎样才可以让客户端识别到一个真正的服务端呢。

      这就需要一个除了客户端、服务器以外第三方的机构,来验证是否同一个public key。


      解决"中间人问题"——引入证书

      当服务端申请一个域名地址的时候,需要向这个"第三方机构”申请一个证书。

      然后,第三方机构,就会给这个服务器颁发一个"证书",证明服务器是合法的。

      其中,服务器自己生成的这个密钥在进行网络传输的时候,就会存放到这个"证书"当中。

      当客户端收到一个包含密钥的证书之后,它有两种方案验证其真假性:

      方案1:查看"第三方机构"当中是否包含这个证书。     

      方案2:这个证书上面总有一些特殊的标记字段,可以证明真假。

      对于方案1,如果每次都需要去公信机构查询证书是否合,显然效率太低且太冗余。

      因此,客户端自身就会包含一些公信的信息,这部分信息是隐藏在客户端的操作系统当中的。


       如果客户端发现这个证书是假的,那么就会弹窗警告。

       如何查看这个证书呢?

         

      可以看到,这一个证书,是被认证过了的。

      图解一下上述的过程:

       这个时候,如果黑客想篡改数据,那么黑客就首先要获得证书,客户端才会相信它。如果获取不到,那就没办法解密。

以上和证书有关系的内容,都是包含在SSL当中的。


HTTPS的TLS握手过程

TLS握手过程主要包括以下几个步骤:

‌客户端问候(Client Hello)‌:

客户端向服务器发送“Client Hello”消息,包含支持的TLS版本、加密套件列表和一个随机数(Client Random)。

服务器问候(Server Hello)‌:

服务器回复“Server Hello”消息,包含服务器选择的TLS版本、加密套件和另一个随机数(Server Random)。服务器还会发送其SSL证书,用于身份验证。

‌服务器密钥交换和证书请求(Server Key Exchange and Certificate Request)‌:

服务器发送密钥交换信息(如Diffie-Hellman参数)和可能的证书请求,以便客户端提供其证书进行双向认证。

客户端证书和密钥交换(Client Certificate and Key Exchange)‌:

如果服务器请求了客户端证书,客户端会发送其证书。客户端生成一个预主密钥(Premaster Secret),并使用服务器的公钥加密后发送给服务器。
‌生成会话密钥(Generate Session Keys)‌:
客户端和服务器使用Client Random、Server Random和预主密钥生成会话密钥,用于后续的对称加密通信。

完成握手(Finish Handshake)‌:

客户端发送“Finished”消息,用会话密钥加密,表示握手过程结束。服务器也发送“Finished”消息,用会话密钥加密,确认握手完成。


‌安全通信(Secure Communication)‌:

握手完成后,客户端和服务器使用生成的会话密钥进行加密通信。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值