應用層http協議包解析與https加密策略解析

在這里插入圖片描述

文章目錄

  • 一.應用層協議--http協議基礎認知
  • 二.https協議加密策略解析
    • 加密策略1--通信雙方只使用對稱加密
    • 加密策略2--通信雙方使用單方非對稱加密
    • 加密策略3--通信雙方都使用非對稱加密
    • 加密策略4--非對稱加密與對稱加密配合使用
    • 中間人攻擊
    • 數據簽名與CA證書
    • HTTPS數據安全認證的本質:非對稱加密+對稱加密+證書認證

一.應用層協議–http協議基礎認知

  • 圖解http協議報文結構:
    在這里插入圖片描述
  • http協議默認是無狀態協議
  • http-request中請求行的請求方法最常用的是GETPOST
    • GETPOST方法都支持用戶進行參數提交,GET方法提交參數通過URL字段進行提交,POST方法提交參數通過Cotent正文進行提交
  • http報文解析和封裝的實驗代碼:
#pragma once
#include "log.hpp"
#include "Socket.cpp"
#include <pthread.h>
#include <fstream>
#include <unordered_map>
#include <vector>
#include <iostream>
#include <sstream>
//協議請求處理類-->request反序列化處理類
class HttpRequest{const std::string Webroot_ ="./index"; // web 根目錄const std::string sep_ = "\r\n";const std::string homepage_ = "index.html";
public://反序列化接口-->獲取請求報頭和正文字段-->報頭存在vector中,text放在string中void Deserialize(std::string request){int begin = 0;while(true){std::size_t pos = request.find(sep_,begin);if(pos == std::string::npos){break;}std::string temp = request.substr(begin, pos-begin);if(temp.empty()){//截取到空行,報頭截取完畢begin = pos + sep_.size();break;}req_header_.push_back(std::move(temp));begin = pos + sep_.size();}//截取正文字段text_ = request.substr(begin,request.size() - begin);}//解析http報頭第一行的內容,包括請求方法,請求的資源路徑,請求的資源url,http協議版本,請求中的服務器資源路徑//獲取的url是服務器端口號之后的資源路徑信息void Parse(){if(req_header_.size() == 0){lg(Warning,"req_header_ is empty\n");return;}//將協議報頭的第一行以空格為分隔符,分別存入三個string中std::stringstream Stream(req_header_[0]);Stream >> method_ >> url_ >> http_version_;//從報頭第一行的url字段中提取出資源在服務器上的路徑和所請求的資源的文件后綴file_path_ = Webroot_;  //前綴加上服務器根目錄if(url_ == "/" || url_ == "/index.html"){//構建Web主頁路徑file_path_ += "/";file_path_ += homepage_;}else{//構建資源在服務器上的路徑file_path_ += url_;}//構建所請求的資源的文件后綴auto pos = file_path_.rfind(".");if(pos == std::string::npos){//默認后綴suffix_ = ".html";}else{suffix_ = file_path_.substr(pos);}}//打印客戶端請求內容void DebugPrint(){//打印協議報頭for(auto &line : req_header_){std::cout << "--------------------------------" << std::endl;std::cout << line << std::endl;}//打印報頭解析和正文std::cout << "method: " << method_ << std::endl;std::cout << "url: " << url_ << std::endl;std::cout << "http_version: " << http_version_ << std::endl;std::cout << "file_path: " << file_path_ << std::endl;std::cout << "--------------------------------" << std::endl;std::cout << text_ << std::endl;}
public:std::vector<std::string> req_header_;   //協議報頭std::string text_;                      //協議正文字段//http報頭解析結果std::string method_;         //請求中的方法std::string url_;            //請求中的url字段std::string http_version_;   //請求中的http協議版本std::string file_path_;      //請求中的資源路徑std::string suffix_;         //請求中的待讀取的文件后綴
};
  • 服務端接收客戶端報文并構建響應的簡單服務器:
class http_server{const int size = 4096;class ThreadData{public:ThreadData(int fd, http_server *s) : sockfd(fd), svr(s){}public:int sockfd;http_server *svr;};const std::string Webroot_ ="./index"; // web 根目錄const std::string sep_ = "\r\n";const std::string homepage_ = "index.html";
public:http_server(const std::string& de_ip = "172.19.29.44",uint16_t de_port = 8081): socket_(de_ip,de_port){MAP.insert({".html", "text/html"});MAP.insert({".png", "image/png"});}~http_server(){}public:bool Init(){socket_.BuildSocket();socketfd_ = socket_.Get_Server_fd();if(!socket_.SocketBind()){lg(Fatal,"socket bind error\n");return false;}if(!socket_.Socklisten()){lg(Fatal,"socket listen error\n");return false;}return true;}void Start(){while(true){std::string client_ip;uint16_t client_port;int fd = socket_.SockAccept(client_ip,client_port);if(fd < 0){lg(Warning,"Accept error\n");continue;}lg(Info, "get a new connect, sockfd: %d", fd);ThreadData * td = new ThreadData(fd,this);pthread_t tid;pthread_create(&tid,nullptr,Routine,td);}}
private:static void * Routine(void * args){ThreadData * td = static_cast<ThreadData *>(args);pthread_detach(pthread_self());td->svr->HandlerHttp(td->sockfd);delete td;close(td->sockfd);return nullptr;}//處理http請求并構建http回應void HandlerHttp(int sockfd){char buffer[10240];//讀取客戶端請求ssize_t n = recv(sockfd, buffer, sizeof(buffer) - 1, 0);if (n > 0){buffer[n] = 0;std::cout << buffer << std::endl;//對客戶端請求進行解析HttpRequest req;req.Deserialize(buffer);req.Parse();req.DebugPrint();//構建http響應//讀取客戶端請求的文件資源,構建http響應正文std::string text;bool isFound = true;text = ReadHtmlContent(req.file_path_);if(text.empty()){//客戶端請求的資源不存在isFound = false;std::string err_html = Webroot_;err_html += "/";err_html += "err.html";text = ReadHtmlContent(err_html);//讀取404頁面返回給客戶端}//構建http響應報頭第一行std::string response_line;if(isFound)response_line = "HTTP/1.0 200 OK\r\n";elseresponse_line = "HTTP/1.0 404 Not Found\r\n";//構建http響應報頭中的各個屬性字段//正文長度std::string response_header = "Content-Length: ";response_header += std::to_string(text.size());response_header += "\r\n";//正文文件的類型(后綴)response_header += "Content-Type: ";response_header += SuffixToDesc(req.suffix_);response_header += "\r\n";//設置瀏覽器緩存-->瀏覽器的下一次請求中url會加上該字段response_header += "Set-Cookie: name=zhounaiqing&&passwd=12345678";response_header += "\r\n";//頁面自動跳轉定位-->瀏覽器讀到會自動進行頁面跳轉response_header += "Location: https://www.qq.com\r\n";//構建空行std::string blank_line = "\r\n";//構建完整http回應字段std::string response = std::move(response_line);response += std::move(response_header);response += std::move(blank_line);response += std::move(text);//向客戶端發送http回應send(sockfd, response.c_str(), response.size(), 0);}}std::string SuffixToDesc(const std::string &suffix){auto iter = MAP.find(suffix);if(iter == MAP.end()) return MAP[".html"];else return MAP[suffix];}//以二進制的方式讀取文件static std::string ReadHtmlContent(const std::string &htmlpath){std::ifstream in(htmlpath, std::ios::binary);if(!in.is_open()){lg(Warning,"Html_File open error\n");return "";} //文件指針定位到文件末尾in.seekg(0, std::ios_base::end);auto len = in.tellg();//文件指針定位到文件開頭in.seekg(0, std::ios_base::beg);std::string content;content.resize(len);in.read((char*)content.c_str(), content.size());in.close();return content;}
private:MySocket::Socket socket_;int socketfd_;std::string server_ip_;uint16_t server_port_;std::unordered_map<string,string>MAP;
};

二.https協議加密策略解析

  • https協議是基于http協議的加密通信協議,其很大程度上保證CS兩端的數據安全
  • 對稱加密:同一個密鑰可以進行報文的加密和解密操作
  • 非對稱加密:存在公鑰私鑰,私鑰加密的報文由公鑰進行解密,公鑰加密的報文由私鑰進行解密,使用上公鑰可以對外公開,私鑰保密

加密策略1–通信雙方只使用對稱加密

在這里插入圖片描述

  • 這種加密策略需要雙方通信前約定密鑰的選擇,因此密鑰可能外泄,顯然是不安全的

加密策略2–通信雙方使用單方非對稱加密

  • 服務器持有公鑰和私鑰,通信前,服務器將公鑰發給客戶端完成加密握手協商,后續客戶端的請求報文就通過公鑰加密發送給服務器
    在這里插入圖片描述
  • 該加密策略顯然無法保證服務端的報文安全

加密策略3–通信雙方都使用非對稱加密

  • 服務器和客戶端都各自持有私鑰,通信之前雙方先交換公鑰完成加密握手協商,后續通過公鑰加密報文進行通信,這種通信策略的效率較為低下(非對稱加密算法復雜度高)
    在這里插入圖片描述

加密策略4–非對稱加密與對稱加密配合使用

  • 服務端持有私鑰S,并將公鑰S'發送給客戶端,客戶端利用公鑰S',加密自己的對稱密鑰K并發送給服務端(保證了密鑰K不外泄)完成加密握手協商,雙方后續使用對稱密鑰K進行雙向通信,這種通信策略的效率較高
    在這里插入圖片描述
  • 策略4在四個策略中最優,但是策略2,策略3,策略4在通信前都存在一個加密握手協商的過程,在這個過程中如果存在中間人攻擊,進行了密鑰置換,就會導致泄密

中間人攻擊

  • 以策略4為例:
    在這里插入圖片描述
  • 上述密鑰置換風險的本質是客戶端(或服務端)無法識別公鑰本身的真正來源,因此必須引入證書補全這個安全漏洞

數據簽名與CA證書

在這里插入圖片描述

  • CA證書是由權威機構服務端機構頒發的公鑰身份證,用于確保客戶端能夠識別出公鑰來源的合法性,其識別原理的核心在于證書上的數據簽名.
  • CA證書上的數據簽名是一段由CA機構私鑰加密的密文,密文中被加密的內容是證書上數據的哈希映射值(并且是不可逆映射),所有的操作系統在出廠前內置了CA機構公開的公鑰,因此客戶端可以對CA證書上的數據簽名進行解密得到一個原證書數據的哈希散列值Hash1,此時客戶端再將證書上的實時數據進行哈希映射得到哈希散列值Hash2,若Hash1Hash2不相同,則說明證書被中間人篡改過,此時客戶端可以向用戶發出安全性警告.
  • 需要注意的是,數據簽名是由CA機構用私鑰進行加密的,由于CA機構的私鑰是絕對保密的,因此中間人沒有辦法重新生成新的數據簽名,所以數據簽名是絕對權威性的
  • CA證書認證過程圖解:
    在這里插入圖片描述

HTTPS數據安全認證的本質:非對稱加密+對稱加密+證書認證

  • HTTPS協議工作流程:
    在這里插入圖片描述
    在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715350.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715350.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715350.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二維碼門樓牌管理系統技術服務的分類與應用

文章目錄 前言一、二維碼門樓牌管理系統的分類二、二維碼門樓牌管理系統的應用優勢三、結論 前言 隨著城市管理的精細化和智能化&#xff0c;二維碼門樓牌管理系統成為了現代城市管理的重要工具。該系統將傳統的門牌、樓牌、戶牌與二維碼技術相結合&#xff0c;實現了信息的快…

如何優化一個運行緩慢的SQL查詢?有哪些常見的優化技巧?

如何優化一個運行緩慢的SQL查詢&#xff1f; 當面對一個運行緩慢的SQL查詢時&#xff0c;優化是提升數據庫性能的關鍵步驟。優化查詢不僅可以減少查詢執行時間&#xff0c;還可以降低系統資源消耗&#xff0c;提高整體的系統吞吐量。以下將詳細探討如何優化一個運行緩慢的SQL查…

MySQL:常用的SQL語句

提醒&#xff1a;設定下面的語句是在數據庫名為 db_book執行的。 一、創建表 1. 創建t_booktype表 USE db_book; CREATE TABLE t_booktype(id INT AUTO_INCREMENT, bookTypeName VARCHAR(20),bookTypeDesc varchar(200),PRIMARY KEY (id) );2. 創建t_book表 USE db_book; C…

[筆記] wsl 禁用配置 win系統環境變量+代理

wsl 配置禁用 win系統環境變量 進入 wsl 的 /etc/wsl.conf 目錄&#xff0c;增加以下配置&#xff1a; [interop] enabledfalse appendWindowsPathfalse然后退出wsl&#xff0c;并且執行關閉正在運行的 wsl&#xff0c;執行命令 wsl --shutdown 最后重新進入wsl 即可。 參考…

C語言-----動態內存管理(1)

1.引入 我們之前已經學習了幾種開辟內存空間的方式&#xff1a; &#xff08;1&#xff09;int a10;開辟4個字節大小的空間 &#xff08;2&#xff09;int arr[10]{0}定義數組開辟了一串連續的空間 2.malloc和free (1)malloc開辟內存空間可能會失敗&#xff0c;因此需要檢查…

HTML5+CSS3+JS小實例:文字陰影還能這么玩

實例:文字陰影還能這么玩 技術棧:HTML+CSS+JS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge"…

Android java基礎_泛型

一.java泛型是什么 Java 泛型&#xff08;Generic&#xff09;是 Java 5 中引入的一種特性&#xff0c;它允許類、接口和方法在定義時使用一個或多個類型參數&#xff0c;這些類型參數在調用時會被實際類型替換&#xff0c;從而增強了代碼的重用性和類型安全性。通過使用泛型&…

鴻蒙Harmony應用開發—ArkTS聲明式開發(通用屬性:形狀裁剪)

用于對組件進行裁剪、遮罩處理。 說明&#xff1a; 從API Version 7開始支持。后續版本如有新增內容&#xff0c;則采用上角標單獨標記該內容的起始版本。 clip clip(value: boolean | CircleAttribute | EllipseAttribute | PathAttribute | RectAttribute) 按指定的形狀對當…

Spring基礎——XML配置Bean的實例化

目錄 實例化Bean的方式使用構造函數實例化Bean使用靜態工廠的方式實例化Bean使用實例化工廠方式實例化Bean通過實現FactoryBean自定義實例化Bean 實例化Bean的方式 bean的創建本質上就是創建一個或多個具有外部配置屬性的對象&#xff0c;容器在啟動的時候會查看命名Bean的配置…

中美加密監管突傳“巨響”!比特幣突破7萬信號出現!馬斯克一句話掀起大行情!

比特幣本周觸及64000美元高價&#xff0c;2月交易所儲備減少近45000多枚比特幣&#xff0c;市場將其解讀為看漲70000美元的關鍵信號。中美加密監管傳利好&#xff0c;香港加密牌照申請期限結束&#xff0c;已有24家機構入列待批&#xff0c;美國考慮允許比特幣ETF及相關信托期權…

uview2中上傳文件和若依前后端分離配合的代碼

uview2中的上傳文件需要配合著自己后端的上傳的代碼 uview2 代碼&#xff1a; uploadFilePromise(url) {return new Promise((resolve, reject) > {// 后續自己封裝let a uni.uploadFile({//自己的請求路徑url: that.$baseURL /uploadAvater, //上傳的文件filePath: tha…

Java | vscode如何使用命令行運行Java程序

1.在vscode中新建一個終端 2.在終端中輸入命令 javac <源文件>此命令執行后&#xff0c;在文件夾中會生成一個與原java程序同名的.class文件。然后輸入如下命令&#xff1a; java <源文件名稱>這樣java程序就運行成功了。&#x1f607;

LeetCode:2368. 受限條件下可到達節點的數目(dfs Java)

目錄 2368. 受限條件下可到達節點的數目 題目描述&#xff1a; 實現代碼與解析&#xff1a; DFS 原理思路&#xff1a; 2368. 受限條件下可到達節點的數目 題目描述&#xff1a; 現有一棵由 n 個節點組成的無向樹&#xff0c;節點編號從 0 到 n - 1 &#xff0c;共有 n - …

02-Vue 計算屬性與監聽器與VUE-cli使用

1.計算屬性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,…

Android java基礎_反射

一.反射的基本概念 反射&#xff08;Reflection&#xff09;&#xff0c;Java 中的反射機制是指&#xff0c;Java 程序在運行期間可以獲取到一個對象的全部信息。 反射機制一般用來解決Java 程序運行期間&#xff0c;對某個實例對象一無所知的情況下&#xff0c;如何調用該對…

單源最短路的建圖方式

1129. 熱浪 - AcWing題庫 這道題可以有三種方法來做&#xff0c;樸素版的dijkstra、堆優化版的dijkstra和spfa算法 &#xff08;1&#xff09;spfa算法 這里的隊列用循環隊列&#xff0c;而不是像模板那樣用普通隊列是因為它的隊列長度不確定 import java.util.*;public class…

mysql 大數據量分批添加索引

先在測試環境測試&#xff0c;沒問題再上生產環境&#xff0c;避免生產環境數據庫負載過多而崩潰 創建存儲過程 DELIMITER //CREATE PROCEDURE batch_add_index_to_email() BEGINDECLARE done INT DEFAULT FALSE;DECLARE start_id INT DEFAULT 0;DECLARE end_id INT;DECLARE …

貝葉斯優化CNN分類(matlab代碼)

貝葉斯優化CNN分類matlab代碼 數據為Excel分類數據集數據。 數據集劃分為訓練集、驗證集、測試集&#xff0c;比例為8:1:1 數據處理: 在數據加載后&#xff0c;對數據進行了劃分&#xff0c;包括訓練集、驗證集和測試集&#xff0c;這有助于評估模型的泛化能力。 數據標準化…

13.7隊列的實戰(通過鏈表實現)

學個二叉樹&#xff0c;又要用上隊列的代碼&#xff0c;上學期學的隊列忘光光了&#xff0c;這不沒辦法回來復習咯 代碼&#xff1a; #include <stdio.h> #include <stdlib.h>typedef int ElemType; typedef struct LinkNode{ElemType data;struct LinkNode *next…

動態規劃(算法競賽、藍橋杯)--樹形DP沒有上司的舞會

1、B站視頻鏈接&#xff1a;E17 樹形DP Luogu P1352 沒有上司的舞會_嗶哩嗶哩_bilibili 題目鏈接&#xff1a;沒有上司的舞會 - 洛谷 #include <bits/stdc.h> using namespace std; const int N6010; int n; int w[N]; vector<int>a[N];//鄰接表 bool fa[N]; int…