【騰許Bugly干貨分享】“HTTPS”安全在哪里?

背景

最近基于興趣學學習了下 HTTPS 相關的知識,在此記錄下學習心得。

在上網獲取信息的過程中,我們接觸最多的信息加密傳輸方式也莫過于 HTTPS 了。每當訪問一個站點,瀏覽器的地址欄中出現綠色圖標時,意味著該站點支持 HTTPS 信息傳輸方式。我們知道 HTTPS 是我們常見的 HTTP 協議與某個加密協議的混合體,也就是 HTTP+S。這個 S 可以是 TLS(安全傳輸層協議)、也可以是 SSL(安全套接層),不過我更認可另一個抽象概括的說法,HTTP+Security。不過要談論 HTTPS 為何安全,還得從 HTTP 為何不安全說起。

假設你現在正坐在教室里上課,現在你非常想和走道旁的迷人的 TA 說一些話,一般這個時候你會用“傳紙條”的方式來交流。而這個方式和 TCP/IP 協議基本的工作模式十分相像:

  1. 通過小動作引起對方注意;
  2. 對方以多種可能的方式(注視、肢體語言等)回應于你;
  3. 你確認對方感知到你后,將紙條傳給對方;
  4. 對方閱讀紙條;
  5. 對方給予你閱讀后的反應;

    怎么樣,這個流程是不是很熟悉?

    如果你要傳遞紙條的 TA 距離你很遠怎么辦?HTTP 協議就是指你在紙條上寫明你要傳給的 TA 是誰,或者 TA 的座位在哪,接著只需要途徑的同學拿到紙條后根據紙條上的指示依次將紙條傳過去就 OK 了。

    這個時候問題來了:途徑的同學完全可以觀看并知道你在紙條上寫了什么。

    這就是 HTTP 傳輸所面臨的問題之一:中間人攻擊,指消息傳遞的過程中,處在傳遞路徑上的攻擊者可以嗅探或者竊聽傳輸數據的內容。

    加密

    HTTPS 針對這個問題,采用了“加密”的方式來解決。最著名原始的加密方法就是對稱加密算法了,就是雙方約定一個暗號,用什么字母替換什么字母之類的。現在一般采用一種叫 AES(高級加密算法)的對稱算法。

    對稱加密算法既指加密和解密需要使用的密鑰 key 是一樣的。

    AES 在數學上保證了,只要你使用的 key 足夠長,破解幾乎是不可能的(除非光子計算機造出來了)

    我們先假設在沒有密鑰 key 的情況下,密文是無法被破解的,然后再回到這個教室。你將用 AES 加密后的內容噌噌噌地寫在了紙條上,正要傳出去的時候你突然想到,TA 沒有 key 怎么解密內容呀,或者說,應該怎么把 key 給TA?

    如果把 key 也寫在紙條上,那么中間人照樣可以破解竊聽紙條內容。也許在現實環境中你有其他辦法可以把 key 通過某種安全的渠道送到 TA 的手里,但是互聯網上的實現難度就比較大了,畢竟不管怎樣,數據都要經過那些路由。

    于是聰明的人類發明了另一種加密算法——非對稱加密算法。這種加密算法會生成兩個密鑰(key1 和 key2)。凡是 key1 加密的數據,key1 自身不能解密,需要 key2 才能解密;凡事 key2 加密的數據,key2 自身不能解密,只有 key1 才能解密。

    目前這種算法有很多中,最常用的是 RSA。其基于的數學原理是:

    兩個大素數的乘積很容易算,但是用這個乘積去算出是哪兩個素數相乘就很復雜了。好在以目前的技術,分解大數的素因確實比較困難,尤其是當這個大數足夠大的時候(通常使用2的10次方個二進制位那么大),就算是超級計算機,解密也需要非常長的時間。

    現在就把這種非對稱加密的方法應用在我們教室傳紙條的場景里。

  • 你在寫紙條內容之前先用 RSA 技術生成了一對密鑰 k1 和 k2。
  • 你把 k1 用明文傳了出去,路經也許有人會截取,但是沒有用,k1 加密的數據需要 k2 才可以破解,而 k2 在你自己手中。
  • k1 傳到了目的人,目的人會去準備一個接下來準備用于對稱加密(AES)的傳輸密鑰 key,然后用收到的 k1 把 key 加密,傳給你。
  • 你用手上的 k2 解出 key 后,全教室只有你和你的目的人擁有這個對稱加密的 key,你們倆就可以盡情聊天不怕竊聽啦~

    這里也許你會有問題,為什么不直接用非對稱加密來加密信息,而是加密 AES 的 key 呢?
    因為非對稱加密和解密的平均消耗時間比較長,為了節省時間提高效率,我們通常只是用它來交換密鑰,而非直接傳輸數據。

    然而使用非對稱加密真的可以防范中間人攻擊嗎?
    雖然看上去很安全,但是實際上卻擋不住可惡的中間人攻擊。

    假設你是 A,你的目的地是 B,現在要途徑一個惡意同學M。

    中間人的惡意之處在于它會偽裝成你的目標。

  • 當你要和 B 完成第一次密鑰交換的時候,M 把紙條扣了下來,假裝自己是B并偽造了一個 key,然后用你發來的 k1 加密了 key 發還給你。

  • 你以為你和 B 完成了密鑰交換,實際上你是和 M 完成了密鑰交換。
  • 同事 M 和 B 完成一次密鑰交換,讓 B 以為和 A 你完成了密鑰交換。
  • 現在整體的加密流程變成了A(加密鏈接1)->M(明文)->B(加密鏈接2)的情況了,這時候 M 依然可以知道A和B傳輸的全部消息。

    這個時候就是體現 HTTPS 和傳紙條的區別了。在教室里,你是和一位與你身份幾乎對等的的對象來通信;而在訪問網站時,對方往往是一個比較大(或者知名)的服務者,他們有充沛的資源,或許他們可以向你證明他們的合法性。

    此時我們需要引入一個非常權威的第三方,一個專門用來認證網站合法性的組織,可以叫做 CA(Certificate Authority)。各個網站服務商可以向 CA 申請證書,使得他們在建立安全連接時可以帶上 CA 的簽名。而 CA 得安全性是由操作系統或者瀏覽器來認證的。

    你的 Windows、Mac、Linux、Chrome、Safari 等會在安裝的時候帶上一個他們認為安全的 CA 證書列表,只有和你建立安全連接的網站帶有這些CA的簽名,操作系統和瀏覽器才會認為這個鏈接是安全的,否則就有可能遭到中間人攻擊。

    一旦某個 CA 頒發的證書被用于的非法途徑,那么這個 CA 之前頒發過的所有證書都將被視為不安全的,這讓所有 CA 在頒發證書時都十分小心,所以 CA 證書在通常情況下是值得信任的。

    總結

    使 HTTP 后面增加一個S(Security)的技術,正是 對稱加密 + 非對稱加密 + CA 認證 這三種技術的混合體。當然這個主要是 HTTPS 的基本原理,真正實際中的 HTTPS 的協議是比以上的描述更為復雜一些的,并且其中任何一步稍有閃失,整個流程都將不再安全。

    這也是為什么 HTTPS 協議從 SSL 1.0升級到 SSL 3.0,再被 TLS 1.0 現在被 TLS 1.3取代,其背后都是一個個細節上的優化,以防有任何閃失。

    TLS 協議相比 SSL 協議增加了傳輸層的安全保證。

?

轉載于:https://www.cnblogs.com/bugly/p/5543417.html

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

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

相關文章

CCNP精粹系列之十八--路由映射實戰二,博主推薦文章

路由映射實戰二 本篇博文和上一篇是緊密結合的,只是在上個試驗的基礎上作了改動,達到其他的試驗效果。試驗二:在R1上增加一個網段,并發布路由。這里采用三種方法。 如下是第一種,是在試驗一的基礎上直接增加一個網段&a…

HDU 1599 find the mincost route

Floyd可解。求最短。在路上來回。使用Floyd 而在 三同時不 找出最短。然后更新。沒有推理啟動&#xff01;INF。一堆負面結果溢出。 #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map…

學習筆記(09):Python網絡編程并發編程-模擬ssh遠程執行命令-代碼實現

立即學習:https://edu.csdn.net/course/play/24458/296239?utm_sourceblogtoedu 1.服務器端&#xff1a;接收客戶端發送的命令,subprocess.POPE()函數可用于產生一個子進程&#xff0c;并且返回子進程的結果 import socket import subprocessphone socket.socket(socket.AF…

C++中兩個數交換不引進中間變量的方法

int a8,b2; 二進制的a1000,b0010; aa方法一&#xff1a;使用異或思想&#xff08;最高級方法&#xff09; aa^b; ba^b; aa^b 方法二&#xff1a;使用加法加法&#xff08;高級方法&#xff09; aab; ba-b; aa-b; 方法三&#xff1a;引進中間變量&#xff08;一般方法&#xff0…

【JUC】JDK1.8源碼分析之ConcurrentLinkedQueue(五)

一、前言 接著前面的分析&#xff0c;接下來分析ConcurrentLinkedQueue&#xff0c;ConcurerntLinkedQueue一個基于鏈接節點的無界線程安全隊列。此隊列按照 FIFO&#xff08;先進先出&#xff09;原則對元素進行排序。隊列的頭部是隊列中時間最長的元素。隊列的尾部 是隊列中時…

學習筆記(10):Python網絡編程并發編程-粘包現象

立即學習:https://edu.csdn.net/course/play/24458/296240?utm_sourceblogtoedu粘包現象&#xff1a;服務器接收到客戶端的命令后&#xff0c;進行執行得到結果后&#xff0c;再發送回給客戶端&#xff0c;在這個過程中如果服務器返回的結果的字節數會大于客戶端所接收最大字節…

某法院HP-P4500存儲數據恢復案例

好久沒出來寫博客了&#xff0c;過年來了一直很忙&#xff0c;尤其是最近&#xff0c;忙著做了好幾個大單子。先是一個醫院50TB的HP-EVA4400&#xff0c;接著是一個法院12TB的HP-P4500&#xff0c;前幾天還有做了一個某游樂城12TB的VMware VMFS虛擬機恢復。雖然忙點&#xff0c…

數組指針與指針數組的區別

1、數組指針 定義&#xff1a;數組指針式一個指向一維數組的指針變量&#xff0c;定義數組指針的格式為&#xff1a; int (*p) [5] 數據類型 &#xff08;*指針名&#xff09; [常量表達式] 數組元素為整形&#xff0c;*p的兩側圓括號不能省略 2、指針數組 定義&#xff1a…

[thinkphp] 是如何輸出一個頁面的

表面上看&#xff0c;TP輸出一個頁面很簡單&#xff1a;$this->display(); 實際上是怎么回事呢&#xff1f;$this->display(); 這個display()方法是定義在ThinkPHP/Library/Think/Controller.class.php這個文件中的 protected function display($templateFile,$charset,$…

關于反射blog

非常好的Java反射例子 瘋狂java 在學習編程的過程中&#xff0c;我覺得不止要獲得課本的知識&#xff0c;更多的是通過學習技術知識提高解決問題的能力&#xff0c;這樣我們才能走在最前方&#xff0c;更多Java學習&#xff0c;請瀏覽瘋狂java官網。Java反射在我們Java學習的…

學習筆記(11):Python網絡編程并發編程-粘包底層原理分析

立即學習:https://edu.csdn.net/course/play/24458/296241?utm_sourceblogtoedu1.send和recv底層分析 1&#xff09;不管是recv還是send都不是直接接收對方數據或者發送給對方數據&#xff0c;而是對自己的操作系統內存進行操作&#xff1b; 2&#xff09;客戶端與服務端并不是…

切面編程(4)

這篇介紹的是最為常見的切面編程首先介紹的是通過注解Aspect來配置AOP類Component Aspect public class Acsep {//定義切入點Pointcut("execution(* com.test.*.*(..))")//切面公式public void aspect(){ }//執行方法之前Before("aspect()")public void be…

c++存儲類型

1、c中的存儲類型一般有靜態存儲、棧、和自動類型三種&#xff0c;一般默認值是為自動類型auto

多線程編程 (1) -NSThread

多線程編程 (1) -NSThread 每個iOS應用程序都有個專門用來更新顯示UI界面、處理用戶觸摸事件的主線程&#xff0c;因此不能將其他太耗時的操作放在主線程中執行&#xff0c;不然會造成主線程堵塞(出現卡機現象)&#xff0c;帶來極壞的用戶體驗。一般的解決方案就是將那些耗時的…

交叉工具鏈的搭建方法(測試成功)

之前安裝了一個rehat6的linux系統&#xff0c;把交叉編譯搭建給忽視了&#xff0c;結果在編譯uboot的時候出現問題&#xff0c;顯示找不到arm-linux-gcc。于是自己來搭建交 叉編譯環境。出現好多錯。先是解壓時沒在后邊加 -C/&#xff0c;后是直接自己創建了個目錄&#xff0c…

VMware內存回收與分配機質

VMware內存回收與分配機質 整理了下學習過的東西&#xff0c;為了防止以后忘記。^_^VMware內存回收按照內存回收先后順充&#xff0c;依次為&#xff1a;1.TPS 透明頁共享2.Ballooning 氣球回收3.Compressiong 內存壓縮4.Swapping 內存交換網上對這個的解釋也挺多&#xff…

學習筆記(12):Python網絡編程并發編程-解決粘包問題-簡單版本

立即學習:https://edu.csdn.net/course/play/24458/296243?utm_sourceblogtoedu 粘包現象的解決&#xff1a;簡單版 1.思路&#xff1a; 在服務器端計算出執行命令后結果的字節長度&#xff0c;然后再將字節數長度send即通知給客戶端&#xff0c;客戶端根據這個字節數的長度一…

關于for循環中的變量int i 如果跳出了這個for循環后,i的值是繼續保留還是被釋放掉了

#include<iostream> using namespace std;int main() {char a[10]; //定義一個一維數組用來存放字符串int i,j; //定義變量cout<<"請輸入字符&#xff1a;“;for(i0;i<10;i) //接收用戶的輸入{ ci…

keil優化等級設置

優化級別說明&#xff08;僅供參考&#xff09;&#xff1a;則其中的 Code Optimization 欄就是用來設置C51的優化級別。共有9個優化級別&#xff08;書上這么寫的&#xff09;&#xff0c;高優化級別中包含了前面所有的優化級別。現將各個級別說明如下&#xff1a;0級優化&…

SVN命令使用詳解

1、檢出svn co http://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名 --password 密碼svn co svn://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名 --password 密碼svn checkout http://路徑(目錄或文件的全路徑) [本地目錄全路徑]…