test1111
- 了解客户端和服务端的请求原理
- HTTP协议及其组成
- HTTPS交互原理分析
访问支付宝,微信的开放接口 都是基于HTTP
对外提供的开放服务 API都是基于HTTP协议的,
微服务中的服务之间的调用大部分都是基于HTTP协议的。
Web层提供http协议的对外接口
http协议是基于TCP可靠通讯协议之上的
fiddler:这是一个抓包工具,抓取网络上一个请求。所有的请求都经过了fiddle。
下载地址:https://www.telerik.com/download/fiddler/fiddler4
post http://csdn.net htt/1.1
方法 URL/URI 协议的版本
Request 请求头
Response
头部
- Host:目标地址
- Connextion:链接地址
- Referrer:做防盗链
- Cookie:携带参数
内容
[“headers”…]
Response
- http/1.1 200 OK
- 协议/版本号
- 响应状态码
- 状态码对应的原因
头部信息
- Server:openresty 基于nigix和lua实现的高性能的web平台
- Date
- Connertion
- ......
URL/URI
URL
网络上的资源位置
http://www.gutapedu.com:80/java/index.html?name=mic#head
指定协议类型(ftp/https)
Host | 域名,然后解析成IP地址 |
Port | 端口号(一般不写) |
Path | 资源路径(虚拟主机对应的路径名称) |
Query-string | 查询字符串 |
#head 片段标识符 | 页面某个地方有个一锚点,到最上边,到最下边 |
URI
统一资源的标识符
- URI定位到互联网上的某一个资源
- URL标识这个互联网上的一个地点
方法
Post | 资源给你 |
Get | 查询 |
Delete | 删除 |
Put | 做更新 |
Option | 服务端告诉我这个URI支持的是什么类型 post get |
Head | 查询请求,拿到head信息,不要返回主体 |
HTTP协议的特点
http协议是无状态的。
两次http请求之间是没有关系的。
http在服务端不需要记录请求的状态,省了很多开销,
比较灵活,应用面更广。
登录,在登录,在登录,哈哈哈
无状态解决方法
http协议引入了cookie机制,解决了http无状态的问题
cookie由服务端生成,保存在客户端,下一次请求携带cookie信息发送过来。
Tomicat中有session session有sessioinID (set-cookie )
客户端保存 cookie.JSESSIONID
下次发送时携带cookie发送到服务端。
不用session的原因
需要通过session统一保存,
分布式架构中需要同步session,统一session的问题。所以我们很多时候自己扮演tomcat生成这样的一个角色,客户端的session信息,我是可以自己保存的,我可以开一个授权服务,专门生成Token,然后把Token返回给客户端的浏览器去保存。
通信是明文的
可以通过抓包工具,拿到http协议的数据
通信被第三方不法分子去抓取,可以拿到你的信息,可以监听,篡改。解决不安全问题。
由https协议
一种加密的超文本传输,发送过程中完全加密
基于TCP协议层之上去扩展的一个协议层。
https和http协议分层一模一样。
https的通信原理
怎么去实现安全传输的。
SSL(Secure Sockets Layer 安全套接层),
http 不加密
https的通信原理
怎么去实现安全传输的??
需要加密:
所以要分配不同的密钥
服务端怎么告诉客户端使用的哪一种加密算法
客户端无法全部都预置密钥,所以就需要在通信过程中把密钥发给客户端。如果在通信过程中拿到密钥的话,又是不安全传输。
涉及网络传输的就是一个不安全的。所以怎么去协商密钥的过程。
密钥的分发也很复杂,是每一次请求都分发,还是第一次分发,
非对称性加密
公钥怎么去拿?
密钥的泄露问题怎么解决
问题在于中间人身份的不确定性
需要一个中间人去证明这个请求是服务端的。
服务端把需要传递给客户端的公钥再做一次加密。
第三方也使用非对称加密
第三方机构
不法分子有可能先获得一个公钥,然后拦截请求之后,替换掉证书。
客户端的数字证书内部内置解密算法。
对称加密 密钥a 密钥a
密钥是统一的。
拿到密钥后,一个更改其他的请求了
每个客户端分配不同的密钥。
服务端怎么告诉客户端要使用哪种加密算法
客户端不能预置密钥,
密钥是网络传输的。
密钥的分发处理起来很麻烦。什么时候分发,怎么分发
每个客户端都可以拿到一个公钥,不同的公钥,每一个客户端拿到不同的公钥。
服务端存储私钥
公钥怎么去传输???
服务端利用网络去分发是一定可以截取的,
中间人可以截取。
引入第三方。
第三方,通过自己的私钥去加密公钥
第三方机构 (CA)
第三方机构(CA)对使用私钥服务端的公钥进行加密
数字证书
证书编号(MD5)。
域名
所有者
有效期
加密(server短的公钥)
数字签名的生成算法:MD5
客户端对证书进行加密
服务端下载数字证书以后,利用内置的公钥进行解密,根据证书的签名算法,对证书的内容进行加密,然后跟服务端发给客户端的消息进行比较。
浏览器或操作系统都会内置一些证书
阿里或微信在你支付的时候会进行提示你进行下载证书。
1.客户端发起请求(Client Hello 包)
三次握手,建立 TCP 连接
支持的协议版本(TLS/SSL)
客户端生成的随机数 client.random,后续用于生成“对话密钥”
客户端支持的加密算法
sessionid,用于保持同一个会话(如果客户端与服务器费尽周折建立了一个 HTTPS 链接,刚建完就断了,也太可惜)
2.服务端收到请求,然后响应(Server Hello)
确认加密通道协议版本
服务端生成的随机数 server.random,后续用于生成“对话密钥”
确认使用的加密算法(用于后续的握手消息进行签名防止篡改)
服务器证书(CA 机构颁发给服务端的证书)
3.客户端收到证书进行验证
验证证书是否是上级 CA 签发的,在验证证书的时候,浏览器会调用系统的证书管理器接口对证书路径中的所有证书一级一级地进行验证,只有路径中所有的证书都是受信的,整个验证的结果才是受信
服务端返回的证书中会包含证书的有效期,可以通过失效日期来验证 证书是否过期
验证证书是否被吊销了
前面我们知道 CA 机构在签发证书的时候,都会使用自己的私钥对证书进行签名 证书里的签名算法字段 sha256RSA 表示 CA 机构使用 sha256 对证书进行摘要,然后使用 RSA 算法对摘要进行私钥签名,而我们也知道 RSA 算法中,使用私钥签名之后,只有公钥才能进行验签。
浏览器使用内置在操作系统上的CA机构的公钥对服务器的证书进行验签。确定这个证书是不是由正规的机构颁发。验签之后得知 CA 机构使用 sha256 进行证书摘要,然后客户端再使用 sha256 对证书内容进行一次摘要,如果得到的值和服务端返回的证书验签之后的摘要相同,表示证书没有被修改过。
验证通过后,就会显示绿色的安全字样
客户端生成随机数,验证通过之后,客户端会生成一个随机数 pre-master secret,客户端根据之前的:Client.random + sever.random + pre-master 生成对称密钥然后使用证书中的公钥进行加密,同时利用前面协商好的加密算法,将握手消息取 HASH 值,然后用“随机数加密握手消息+握手消息 HASH 值(签名)”然后传递给服务器端;(在这里之所以要取握手消息的HASH 值,主要是把握手消息做一个签名,用于验证握手消息在传输过程中没有被篡改过。)
4.服务端接收随机数
服务端收到客户端的加密数据以后,用自己的私钥对密文进行解密。然后得到client.random/server.random/pre-master secret,再用随机数密码 解密 握手消息与 HASH 值,并与传过来的。
HASH 值做对比确认是否一致。
然后用随机密码加密一段握手消息(握手消息+握手消息的 HASH 值)给客户端
5.客户端接收消息
客户端用随机数解密并计算握手消息的 HASH,如果与服务端发来的 HASH 一致,此时握手过程结束,之后所有的通信数据将由之前交互过程中生成的 pre master
secret / client.random/server.random 通过算法得出 session
Key,作为后续交互过程中的对称密钥
WEB攻击手段
主动攻击
我是一个主动的行为,去做SQL注入。
被动攻击
跨站脚本攻击、请求伪造
csrf(Cross-Site Request Forgeries )跨站请求伪造攻击
看了一篇文章的介绍,csrf ,引用下其中评论的一段总结:
CSRF(Cross Site Request Forgery)即跨站请求伪造。就是利用后台有规律的接口,例如 localhost/deleteAriticle.php?id=3&username=xiaoxiao,攻击者在被攻击的网站页面嵌入这样的代码,当用户xiaoxiao访问该网站的时候,会发起这个请求。服务器会删除id为3的数据。
客户端防范:对于数据库的修改请求,全部使用POST提交,禁止使用GET请求。
服务器端防范:一般的做法是在表单里面添加一段隐藏的唯一的token(请求令牌)。
微信公众号:不止极客
test1111的更多相关文章
- java必备基础知识点
Java基础 1. 简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机.冰箱等 2. 简单写出 ...
- Oracle global database name与db link的纠缠关系
ORACLE数据库中Global Database Name与DB LINKS的关系还真是有点纠缠不清,在说清楚这个关系前,我们先来了解一下Global Database Name的概念 Global ...
- Node对象属性
1.Node对象属性一 * nodeName * nodeType * nodeValue * 使用dom解析html时候,需要ht ...
- spring来了-05-JDBC
概述 Spring对C3P0连接池的支持很完善 Spring对jdbc提供了JdbcTemplate,来简化jdbc操作, JdbcTemplate模板工具类,类似于DbUtils组件 JDBC: p ...
- python实现发送邮件功能
'''套接字是为特定的网络协议(例如TCP/IP,ICMP/IP,UDP/IP等),允许程序和接受并进行连接,要在python 中建立具有TCP和流套接字的简单服务器,需要使用socket模块,利用该 ...
- python 中调用windows系统api操作剪贴版
# -*- coding: utf-8 -*- ''' Created on 2013-11-26 @author: Chengshaoling ''' import win32clipboard a ...
- SpringMVC结合ajaxfileupload文件无刷新上传
jQuery没有提供ajax的文件上传,我们可以通过ajaxfileupload实现ajax文件的上传.其实ajaxfileupload文件上传特别的简单.下面就演示一下在SpringMVC中实现aj ...
- AIX smit下创建逻辑卷、添加文件系统并挂载
--AIX smit下创建逻辑卷,添加文件系统并挂载------------------------------------------2013/10/15 首先创建逻辑卷smit lv ,这里没多大 ...
- python之路第五篇之模块和加密算法(进阶篇:续)
模块 Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中有一个概念叫做模块(module) 简单地说,模块就是一个保存了Python代码的文件. 模块分类: 1)内置模块 2)自 ...
- puppet配置问题统计
一. [root@client puppet]# puppetd --test --server master.test.cominfo: Creating a new SSL key for cli ...
随机推荐
- vue全局事件总线
首先在main.js中app实例中使用生命周期钩子添加组件 new Vue({ router, render: h => h(App), beforeCreate() { Vue.prototy ...
- openEuler欧拉配置Nacos集群
一.安装Nacos systemctl stop firewalld systemctl disable firewalld mkdir -p /home/nacos tar xvf nacos- ...
- Redis应用—6.热key探测设计与实践
大纲 1.热key引发的巨大风险 2.以往热key问题怎么解决 3.热key进内存后的优势 4.热key探测关键指标 5.热key探测框架JdHotkey的简介 6.热key探测框架JdHotkey的 ...
- 《Django 5 By Example》读后感
一. 为什么选择这本书? 本人的工作方向为Python Web方向,想了解下今年该方向有哪些新书出版,遂上packt出版社网站上看了看,发现这本书出版时间比较新(2024年9月),那就它了. 从202 ...
- nginx-tengine-invalid IPv6 address in resolver-解析器中无效的IPv6地址
问题描述:解析器中无效的IPv6地址 [root@dm ~]# nginx -t nginx: [emerg] invalid IPv6 address in resolver "[fe80 ...
- TB交易开拓者_趋势跟踪策略_多品种对冲_递进优化回测_A0001188020期货量化策略
如果您需要代写技术指标公式, 请联系我. 龙哥QQ:591438821 龙哥微信:Long622889 也可以把您的通达信,文华技术指标改成TB交易开拓者的自动交易量化策略. 众所周知,投资界有基本面 ...
- 【网络安全】Linux基础详解
声明:学习视频来自 b 站 up 主 泷羽 sec,如涉及侵权马上删除文章 声明:本文主要用作技术分享,所有内容仅供参考.任何使用或依赖于本文信息所造成的法律后果均与本人无关.请读者自行判断风险,并遵 ...
- Qt/C++地图标注点的添加删除移动旋转/指定不同图标和动图/拿到单击信号
一.前言说明 标注点在地图开发中是最常见的应用场景之一,比如在地图上需要显示设备的位置,基本上都是添加标注点,指定图片和尺寸已经经纬度坐标位置.这个功能在每种地图内核中都提供的,这个并没有任何难点,在 ...
- spark (五) RDD的创建 & 分区
目录 1. RDD的创建方式 1.1 从内存创建RDD 1.2 从外部存储(文件)创建RDD 1.3 从其他的RDD创建 1.4 直接 new RDD 2. 分区(partition) 2.1 mak ...
- c# 创建快捷方式并添加到开始菜单程序目录
Using the Windows Script Host (make sure to add a reference to the Windows Script Host Object Model, ...