⑴ 小明同學在自己的電腦上使用word文檔寫了一篇日誌。他想不讓別人輕易看到裡面的內容。你能幫他想想辦法嗎
如果自己的文檔中有不願讓人看見的小秘密,或者所編輯的文件涉及到單位或公司的機密,往往需要防止別人查看我們的文檔。只有對Word文檔進行加密,才能夠實現對Word文檔的保護。給Word文檔加密主要有以下幾個方法:文件加密文件菜單設置:1、打開需要加密的Word文檔。2、選「文件」的「另存為」,出現「另存為」對話框,在「工具」中選「常規選項」,出現「保存」選項卡。3、分別在「打開許可權密碼」和「修改許可權密碼」中輸入密碼(這兩種密碼可以相同也可以不同)。4、再次確認「打開許可權密碼」和「修改許可權密碼」。按「確定」退出「保存」選項卡。5、文件存檔。
由工具菜單設置:1、打開需要加密的Word文檔。2、選「工具」菜單的「選項」命令,出現「選項對話框」。3、在「選項」對話框中選「保存」選項卡。4、分別在「打開許可權密碼」和「修改許可權密碼」中輸入密碼,點「確定」退出。5、將文件保存。
⑵ 圖文徹底搞懂非對稱加密(公鑰密鑰)
前文詳細講解了對稱加密及演算法原理。那麼是不是對稱加密就萬無一失了呢?對稱加密有一個天然的缺點,就是加密方和解密方都要持有同樣的密鑰。你可以能會提出疑問:既然要加、解密,當然雙方都要持有密鑰,這有什麼問題呢?別急,我們繼續往下看。
我們先看一個例子,小明和小紅要進行通信,但是不想被其他人知道通信的內容,所以雙方決定採用對稱加密的方式。他們做了下面的事情:
1、雙方商定了加密和解密的演算法
2、雙方確定密鑰
3、通信過程中採用這個密鑰進行加密和解密
這是不是一個看似完美的方案?但其中有一個步驟存在漏洞!
問題出在步驟2:雙方確定密鑰!
你肯定會問,雙方不確定密鑰,後面的加、解密怎麼做?
問題在於確定下來的密鑰如何讓雙方都知道。密鑰在傳遞過程中也是可能被盜取的!這里引出了一個經典問題:密鑰配送問題。
小明和小紅在商定密鑰的過程中肯定會多次溝通密鑰是什麼。即使單方一次確定下來,也要發給對方。加密是為了保證信息傳輸的安全,但密鑰本身也是信息,密鑰的傳輸安全又該如何保證呢?難不成還要為密鑰的傳輸再做一次加密?這樣不就陷入了死循環?
你是不是在想,密鑰即使被盜取,不還有加密演算法保證信息安全嗎?如果你真的有這個想法,那麼趕緊復習一下上一篇文章講的杜絕隱蔽式安全性。任何演算法最終都會被破譯,所以不能依賴演算法的復雜度來保證安全。
小明和小紅現在左右為難,想加密就要給對方發密鑰,但發密鑰又不能保證密鑰的安全。他們應該怎麼辦呢?
有如下幾種解決密鑰配送問題的方案:
非對稱加密也稱為公鑰密碼。我更願意用非對稱加密這種叫法。因為可以體現出加密和解密使用不同的密鑰。
對稱加密中,我們只需要一個密鑰,通信雙方同時持有。而非對稱加密需要4個密鑰。通信雙方各自准備一對公鑰和私鑰。其中公鑰是公開的,由信息接受方提供給信息發送方。公鑰用來對信息加密。私鑰由信息接受方保留,用來解密。既然公鑰是公開的,就不存在保密問題。也就是說非對稱加密完全不存在密鑰配送問題!你看,是不是完美解決了密鑰配送問題?
回到剛才的例子,小明和下紅經過研究發現非對稱加密能解決他們通信的安全問題,於是做了下面的事情:
1、小明確定了自己的私鑰 mPrivateKey,公鑰 mPublicKey。自己保留私鑰,將公鑰mPublicKey發給了小紅
2、小紅確定了自己的私鑰 hPrivateKey,公鑰 hPublicKey。自己保留私鑰,將公鑰 hPublicKey 發給了小明
3、小明發送信息 「周六早10點soho T1樓下見」,並且用小紅的公鑰 hPublicKey 進行加密。
4、小紅收到信息後用自己的私鑰 hPrivateKey 進行解密。然後回復 「收到,不要遲到」 並用小明的公鑰mPublicKey加密。
5、小明收到信息後用自己的私鑰 mPrivateKey 進行解密。讀取信息後心裡暗想:還提醒我不遲到?每次遲到的都是你吧?
以上過程是一次完整的request和response。通過這個例子我們梳理出一次信息傳輸的非對稱加、解密過程:
1、消息接收方准備好公鑰和私鑰
2、私鑰接收方自己留存、公鑰發布給消息發送方
3、消息發送方使用接收方公鑰對消息進行加密
4、消息接收方用自己的私鑰對消息解密
公鑰只能用做數據加密。公鑰加密的數據,只能用對應的私鑰才能解密。這是非對稱加密的核心概念。
下面我用一個更為形象的例子來幫助大家理解。
我有下圖這樣一個信箱。
由於我只想接收我期望與之通信的朋友信件。於是我在投遞口加了一把鎖,這把鎖的鑰匙(公鑰)我可以復制n份,發給我想接受其信件的人。只有這些人可以用這把鑰匙打開寄信口,把信件投入。
相信通過這個例子,可以幫助大家徹底理解公鑰和私鑰的概念。
RSA 是現在使用最為廣泛的非對稱加密演算法,本節我們來簡單介紹 RSA 加解密的過程。
RSA 加解密演算法其實很簡單:
密文=明文^E mod N
明文=密文^D mod N
RSA 演算法並不會像對稱加密一樣,用玩魔方的方式來打亂原始信息。RSA 加、解密中使用了是同樣的數 N。公鑰是公開的,意味著 N 也是公開的。所以私鑰也可以認為只是 D。
我們接下來看一看 N、E、D 是如何計算的。
1、求 N
首先需要准備兩個很大質數 a 和 b。太小容易破解,太大計算成本太高。我們可以用 512 bit 的數字,安全性要求高的可以使用 1024,2048 bit。
N=a*b
2、求 L
L 只是生成密鑰對過程中產生的數,並不參與加解密。L 是 (a-1) 和 (b-1) 的最小公倍數
3、求 E(公鑰)
E 有兩個限制:
1<E<
E和L的最大公約數為1
第一個條件限制了 E 的取值范圍,第二個條件是為了保證有與 E 對應的解密時用到的 D。
4、求 D(私鑰)
D 也有兩個限制條件:
1<D<L
E*D mod L = 1
第二個條件確保密文解密時能夠成功得到原來的明文。
由於原理涉及很多數學知識,這里就不展開細講,我們只需要了解這個過程中用到這幾個數字及公式。這是理解RSA 安全性的基礎。
由於 N 在公鑰中是公開的,那麼只需要破解 D,就可以解密得到明文。
在實際使用場景中,質數 a,b 一般至少1024 bit,那麼 N 的長度在 2048 bit 以上。D 的長度和 N 接近。以現在計算機的算力,暴力破解 D 是非常困難的。
公鑰是公開的,也就是說 E 和 N 是公開的,那麼是否可以通過 E 和 N 推斷出 D 呢?
E*D mod L = 1
想要推算出 D 就需要先推算出 L。L 是 (a-1) 和 (b-1) 的最小公倍數。想知道 L 就需要知道質數 a 和 b。破解者並不知道這兩個質數,想要破解也只能通過暴力破解。這和直接破解 D 的難度是一樣的。
等等,N 是公開的,而 N = a*b。那麼是否可以對 N 進行質因數分解求得 a 和 b 呢?好在人類還未發現高效進行質因數分解的方法,因此可以認為做質因數分解非常困難。
但是一旦某一天發現了快速做質因數分解的演算法,那麼 RSA 就不再安全
我們可以看出大質數 a 和 b 在 RSA 演算法中的重要性。保證 a 和 b 的安全也就確保了 RSA 演算法的安全性。a 和 b 是通過偽隨機生成器生成的。一旦偽隨機數生成器的演算法有問題,導致隨機性很差或者可以被推斷出來。那麼 RSA 的安全性將被徹底破壞。
中間人攻擊指的是在通信雙方的通道上,混入攻擊者。他對接收方偽裝成發送者,對放送放偽裝成接收者。
他監聽到雙方發送公鑰時,偷偷將消息篡改,發送自己的公鑰給雙方。然後自己則保存下來雙方的公鑰。
如此操作後,雙方加密使用的都是攻擊者的公鑰,那麼後面所有的通信,攻擊者都可以在攔截後進行解密,並且篡改信息內容再用接收方公鑰加密。而接收方拿到的將會是篡改後的信息。實際上,發送和接收方都是在和中間人通信。
要防範中間人,我們需要使用公鑰證書。這部分內容在下一篇文章里會做介紹。
和對稱加密相比較,非對稱加密有如下特點:
1、非對稱加密解決了密碼配送問題
2、非對稱加密的處理速度只有對稱加密的幾百分之一。不適合對很長的消息做加密。
3、1024 bit 的 RSA不應該在被新的應用使用。至少要 2048 bit 的 RSA。
RSA 解決了密碼配送問題,但是效率更低。所以有些時候,根據需求可能會配合使用對稱和非對稱加密,形成混合密碼系統,各取所長。
最後提醒大家,RSA 還可以用於簽名,但要注意是私鑰簽名,公鑰驗簽。發信方用自己的私鑰簽名,收信方用對方公鑰驗簽。關於簽名,後面的文章會再詳細講解。
⑶ HTTPS 加密演算法過程
1、HTTP 協議(HyperText Transfer Protocol,超文本傳輸協議):是客戶端瀏覽器或其他程序與Web伺服器之間的應用層通信協議 。
2、HTTPS 協議(HyperText Transfer Protocol over Secure Socket Layer):可以理解為HTTP+SSL/TLS, 即 HTTP 下加入 SSL 層,HTTPS 的安全基礎是 SSL,因此加密的詳細內容就需要 SSL,用於安全的 HTTP 數據傳輸。
3、SSL(Secure Socket Layer,安全套接字層):1994年為 Netscape 所研發,SSL 協議位於 TCP/IP 協議與各種應用層協議之間,為數據通訊提供安全支持。
4、TLS(Transport Layer Security,傳輸層安全):其前身是 SSL,它最初的幾個版本(SSL 1.0、SSL 2.0、SSL 3.0)。
如上圖所示 HTTPS 相比 HTTP 多了一層 SSL/TLS。
1、對稱加密
有流式、分組兩種,加密和解密都是使用的同一個密鑰。
例如:DES、AES-GCM、ChaCha20-Poly1305等
2、非對稱加密
加密使用的密鑰和解密使用的密鑰是不相同的,分別稱為:公鑰、私鑰,公鑰和演算法都是公開的,私鑰是保密的。非對稱加密演算法性能較低,但是安全性超強,由於其加密特性,非對稱加密演算法能加密的數據長度也是有限的。
例如:RSA、DSA、ECDSA、 DH、ECDHE
3、哈希演算法
將任意長度的信息轉換為較短的固定長度的值,通常其長度要比信息小得多,且演算法不可逆。
例如:MD5、SHA-1、SHA-2、SHA-256 等
4、數字簽名
簽名就是在信息的後面再加上一段內容(信息經過hash後的值),可以證明信息沒有被修改過。hash值一般都會加密後(也就是簽名)再和信息一起發送,以保證這個hash值不被修改。
C++音視頻開發學習資料 :點擊 音視頻開發(資料文檔+視頻教程+面試題)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
HTTP協議在瀏覽器/伺服器間進行數據的傳輸是明文的,不做任何的加密,通俗來說,就是「裸奔」,這樣會產生什麼樣的問題那,我們來舉一個例子:
在這里插入圖片描述
上述我們通過兩個人物模仿了伺服器和客戶端的交互,我們可以看出,小明和小花之間進行數據通信的時候採用的是明文傳輸的、那麼此時很有可能被中間人獲取信息、並進行數據篡改,這種行為就叫 中間人攻擊。
所以 HTTP 傳輸面臨的風險有:
(1) 竊聽風險:黑客可以獲知通信內容。
(2) 篡改風險:黑客可以修改通信內容。
(3) 冒充風險:黑客可以冒充他人身份參與通信。
哈哈、此時你是不是不能很愉快的上網沖浪了呀,別擔心,我們此時可以對明文進行加密:
這樣是不是比原來安全多了呀!但是這樣就足夠安全了嗎?顯然不是的,如果小明和小花在第一次聊天的時候,信息被中間人截取到了,那麼中間人是不是也就有密鑰了,同樣可以對數據進行加解密和修改了那
這可怎麼辦那? 加密的數據還是不安全的啊? 別急,上面我們採用的是對稱加密(換句話說就是我們發送的密鑰技能加密、也能解密,那麼中間人只要拿到密鑰消息對他而言就是透明的了),我們還可以採用非對稱加密方式進行加密數據(非對稱加密一般都會有一個私鑰和公鑰組成。可以通過公鑰加密,私鑰解密,也可以通過私鑰加密,公鑰解密兩種方式) ,對密鑰的傳送在格外加一層保護,當小明和小花在建立通信的時候,小花會把公鑰KEY發送給小明,當小明拿到公鑰KEY 後,會自己生成一個 密鑰 KEY2 , 並用 KEY 對KEY2 進行加密(此時小明用的是公鑰加密)
在通信過程中,即使中間人一開始就獲取到了公鑰KEY ,但是他不知道私鑰,就對數據無法進行解密,仍舊是沒辦法獲取KEY2。這樣加密後,數據是不是就安全多了呀。這種情況下就可以和妹子愉快的進行聊天了嗎?別急、所謂道高一尺魔高一丈,常言道:流氓不可怕,就怕流氓有文化。這種狀態下我們的數據,相當來說是比較安全的,但是如果此時中間人獲取公鑰後,發送給小明一個偽公鑰,又會產生什麼問題那?
好吧,說到這里,大家是不是快恨死這個中間人了啊,哈哈~~~還有據俗話別忘記了,魔高一尺道高一丈,對於這種情況。我們可以藉助與第三方證書平台,證書平台具備產生證書的功能,伺服器(小花)可以去證書機構申請證書,證書機構通過小花提供的信息(網址、機構、法人等、公鑰),生成公鑰和私鑰(證書機構的),通過私鑰進行數據的非對稱加密生成證書、將證書頒發給小花。那麼此時小花就可以在進行數據交互的時候,傳遞證書了。
小明只需要知道證書的發證機構、就可以很方便的獲取到證書的公鑰、從而對證書進行校驗並獲取公鑰、然後進行後續的操作。
那麼此時小夥伴是不是又有疑問了,如果 中間人 獲取到證書、並偽造證書給小明、怎麼破???
不錯不錯、如果大家有這個想法的話,說明大家都在認真思考了。那麼我們假設中間人獲取到了證書、中間人也可以在證書機構獲取公鑰,並通過證書機構公鑰獲取 伺服器發送的公鑰,中間人此時也可以自己生成公鑰,並向證書機構申請證書、並發送偽證書給小明,但是因為證書是經過簽名認證的,包含(網址、機構、法人等、公鑰)等信息,小明在拿到偽證書後,通過證書公鑰很容易就發現證書是不合法的(網址、法人的信息可定不符,否則申請不到證書的)。
上述我們分享的內容就是HTTPS的主體思想,HTTPS增加了SSL安全層,上述介紹的所有認證流程都是在SSL安全層完成驗證的。今天我就分享HTTPS的實現原理就說這么多了。 ﹏
HTTPS 缺點:
(1)SSL 證書費用很高,以及其在伺服器上的部署、更新維護非常繁瑣。
(2)HTTPS 降低用戶訪問速度(多次握手)。
(3)網站改用HTTPS 以後,由HTTP 跳轉到 HTTPS 的方式增加了用戶訪問耗時(多數網站採用302跳轉)。
(4)HTTPS 涉及到的安全演算法會消耗 CPU 資源,需要增加大量機器(https訪問過程需要加解密)。
⑷ 小明手機加密看看
你好,手機加密就是為了保留自己的一點空間,如果你連他的手機密碼都不允許保密,可能是有點過分了,他如果想跟你分享的話不用說就會直接給你看了。愛人之間也要互相留有一點空間的,否則會讓人窒息。.
⑸ 數字簽名/數字證書/對稱/非對稱加密/CA 等概念明晰
此次不深入源碼、不分析原理、只釐清一些易混淆概念及其關聯。
本次將從通信演變歷史的角度出發,一步步闡述概念及其作用。
通過本篇文章,你將了解到:
大部分時候,咱們交流都是靠嘴對嘴,信息完全暴露在他人的耳朵里。
拉拉家常無關緊要,但要是涉及重要、私密的信息就不能這樣子了。
此時可能想到,那我們就說悄悄話吧。
悄悄話只能是倆人近距離才能實現,若是天各一方怎麼才能將信息安全送給對方呢?
大家或多或少地看過諜戰片,那會兒卧底如何將信息傳給組織呢?答案是通過密碼本。
雙方約定好用一個密碼本,密碼本其實是個映射關系:
此時雙方通信是經過加密的,我們稱為密文通信。第三者想要破解信息,就需要拿到密碼本或是破譯出密碼本映射關系,從而將密文轉為明文。
隨著科學技術的發展,人們的交流由書信逐漸過渡為電子通信。
當我們在鍵盤上敲擊一段文字後,這段信息會通過網路發送給對方,怎麼保證這段信息不被別人輕易知道呢?
我們想到了加密,雙方在傳輸信息前商量好一個密鑰,發送方用密鑰將信息進行加密形成密文後再發送,接收方在收到密文後使用之前協商的密鑰進行解密。
舉個簡單例子:
小明現在將信息進行對稱加密:
那麼將明文hello,每個字元+1,得出如下結果:
hello--->ifmmp
小紅拿到密文ifmmp後,她知道密鑰X=1,因此她將密文每個字元-1,得出如下結果:
ifmmp--->hello
至此,小明和小紅成功進行了交流。
此時小剛想知道小明和小紅聊了啥,於是截獲了信息:
但是由於小剛拿到的是密文信息:ifmmp。因為不知道密鑰,因此無法反推出明文:hello。因此小明和小紅的信息交流安全得到了保證。
當然對稱加密演算法沒那麼簡單,常見的對稱加密演算法有如下幾種:
似乎使用對稱加密就可以解決咱們通信安全問題,但引入了另一個問題:
是否有種方式可以光明正大地傳遞信息呢?
答案是:非對稱加密。
接著來看看小明和小紅如何使用非對稱加密來實現安全通信。
小明和小紅分別生成自己的公私鑰:
由上可知,用小紅的公鑰加密的信息只能由小紅的私鑰解開,只要小紅的私鑰沒有泄漏,那麼小明和小紅的通信是安全的。
當然了,真正非對稱加密演算法並沒有那麼簡單,常見的幾種非對稱加密演算法:
小明和小紅的通信真是安全的嗎?
此時小剛又來搞事情了:
以上信息表明:
小明和小紅一合計,想出來了一個辦法:
消息摘要(Message Digest)特點:
常見的消息摘要演算法:MD5、SHA1。
雖然採用了消息摘要,但是小剛依然能夠自己偽造信息,並生成對應的消息摘要,小紅收到後驗證摘要是正確的,便認為是小明發的,這種做法還是有漏洞。
在前邊用到了小紅的公鑰、私鑰,而沒用到小明的公鑰、私鑰。
在消息摘要的基礎上,想辦法讓小明的公私鑰也參與到通信過程中來:
與消息摘要過程對比,此時多了一個步驟:
用私鑰加密的信息的過程我們稱之為:數字簽名
數字簽名具有不可抵賴性的特點。根據前面的描述,用私鑰加密的信息,只有對應的公鑰才能解開。
因此,若是小紅使用了小明的公鑰解開了密文,那麼說明該消息肯定是小明發過來的。反之,小明使用私鑰加密後發出去,代表這信息是確認是自己發的,這就是他的簽名。
常見的數字簽名演算法:RSA、DSA、ECDSA。
老規矩,用圖來看看小明與小紅如何使用數字簽名的。
小明發送信息過程:
小紅處理信息過程:
由上可知:
數字簽名有兩個作用:
整個流程小明的公私鑰、小紅的公私鑰都參與了。
因為小剛沒有小明的私鑰,所以他無法生成小明的數字簽名,最終無法通過小紅對數字簽名的驗證。
這么看來小剛是無能無能為力了?非也!
回顧一下之前說的對稱加密的痛點:如何傳遞對稱密鑰?
實際上非對稱加密也存在問題:如何傳遞公鑰?
可見,無論是對稱加密還是非對稱加密都需要解決密鑰傳遞問題。
若是小剛偽造了小紅的公鑰,情況如下:
因為公鑰被偽造了,所以小剛可以為所欲為。
小明如何才能知道自己收到的公鑰是小紅的呢?
這時候就需要引入權威機構:CA(Certificate Authority) 證書授權中心
有了CA,小紅發布公鑰的流程變了:
用圖表示如下:
圖上5個步驟,有些同學對第4步不太理解:
似乎又回到了原點:如何安全傳遞公鑰的問題。
其實,信任是有起點的。
CA 不僅為他人生成證書,也生成自己的證書,CA 為自己生成的證書里包含了CA的公鑰。
CA 的證書在電腦、手機等設備出場的時候就會預置在系統里、瀏覽器里。
因此,當小明驗證小紅的證書時,會在系統里尋找能夠解開小紅證書的CA 公鑰,若是找到則說明小明證書的頒發機構是可信任的,既然信任了該證書,那麼從證書里取出的公鑰,小明也認可是小紅的。
至此,小紅的公鑰就安全地傳給了小明,後面就可以愉快地通信了。
系統里找不到對應的證書會有什麼影響?大家還記得12306網站剛開始運行的時候,用瀏覽器訪問時瀏覽器會提醒說該網站不受信任,12306提示用戶安裝自己的根證書。
這也從側面說明了,咱們不要輕易更改系統里的證書。
對稱加密存在密鑰傳送被泄漏的風險,非對稱加密雖然不需要傳遞私鑰,但是需要傳遞公鑰,也存在被中間人攻擊的風險。
為此,引入了CA 生產證書解決了非對稱加密公鑰傳遞問題。
然後非對稱加密速度慢,適合加密數據量少的信息,對稱加密速度快,適合加密數據量大的信息。
如何將對稱加密與非對稱加密結合起來打造一個安全的通信鏈路,下篇我們將重點分析其中的典型:SSL/TLS 的原理與應用。
⑹ 加密、簽名、證書的作用及運用場景
本文主要是簡單介紹了常見的加密類型、各自的運用場景、為什麼需要數字簽名和數字證書、HTTPS涉及到的加密流程等。這里主要從使用者的角度出發,對演算法本身不做過多介紹。
對稱/非對稱加密均屬於 可逆加密,可以通過密鑰將密文還原為明文 。
有時候,我們希望明文一旦加密後,任何人(包括自己)都無法通過密文逆推回明文,不可逆加密就是為了滿足這種需求。
不可逆加密主要通過 hash演算法實現:即對目標數據生成一段特定長度hash值 ;無論你的數據是1KB、1MB、1GB,都是生成特定長度的一個Hash值(比如128bit)。這里大家應該能感受到一點 不可逆 的味道,加密後128bit的hash值顯然無法還原出1個G甚至更大的不規則數據的, hash可以看做是原來內容的一個摘要 。
常見演算法:
小明給小紅寫信:
經過九轉十八彎後,信的內容有可能:1. 被窺視 2. 被篡改(冒充小明發送假消息) :
小紅先 生成對稱加密的密鑰key1 ,然後通過一個安全的渠道交予小明。
傳輸數據時,小明 使用key1加密 ,而小紅收到後再 使用key1解密 。
這時候 中間者既看不到原來的內容,也沒辦法篡改 (因為沒有密鑰):
【對稱加密】實現簡單,性能優秀 ,演算法本身安全級別高。然而對 密鑰的管理 卻是個很頭疼的問題:一旦密鑰交到對方手裡,對方對密鑰的保管能力 我方是沒辦法控制 的,一旦對方泄露的話,加密就形同虛設了。
相對而言,【非對稱加密】的公鑰就沒有這個憂慮,因為 公鑰 的設計就是為了 可以公開的 ,盡管對方泄露,我方也不會有任何損失。
小紅生成一對公私鑰,自己持有私鑰(pri_key1),將公鑰(pub_key1)交予小明。
傳輸數據時,小明使用 公鑰加密 ,小紅使用 私鑰解密 。
因為 中間者沒有私鑰,公鑰加密的內容是無法獲取的 。此時達到了 防窺視 的效果:
然而因為 公鑰是可以公開的 ,如果 中間者知曉公鑰 的話,盡管沒有辦法看到原來的內容,卻 可以冒充小明發送假消息 :
這時小紅在想,如果小明發送消息時,能帶上 只有他自己才能生成 的數據(字元串),我就能 驗證是不是小明發的真實消息 了。
通常這個 能證實身份的數據(字元串) 被稱之為 數字簽名(Signature)
小明再生成一對公私鑰 ,自己持有私鑰(pri_key2),將公鑰交予小紅(pub_key2)。
當小明傳輸數據時(可能很大),除了公鑰加密明文之外,還要帶上簽名:(1) 對明文做一個hash摘要 (2)對摘要進行私鑰加密,加密結果即簽名(傳輸內容=內容密文+簽名)
小紅收到後:(1) 解密簽名獲取hash (2)解密內容密文,對解密後的明文進行hash;如果兩個hash一致,說明驗簽通過。
盡管中間者修改了傳輸內容,但因為簽名無法冒認(沒有私鑰),小紅驗簽失敗,自然不會認可這份數據:
通常 非對稱加密要做到防窺視和防篡改,需要有兩對公私鑰 :對方的公鑰用於內容加密,自己的私鑰用於簽名(讓對方驗證身份)。
因為HTTP協議明文通信的安全問題,引入了HTTPS:通過建立一個安全通道(連接),來保證數據傳輸的安全。
伺服器是 沒辦法直接將密鑰傳輸到瀏覽器的 ,因為在 安全連接建立之前,所有通信內容都是明文的 ,中間者可窺視到密鑰信息。
或許這時你想到了非對稱加密,因為公鑰是不怕公開的:
然而在第2步, 中間者可以截取伺服器公鑰,並替換成了自己的公鑰 ,此時加密就沒意義了:
為了 防止公鑰被假冒,數字證書(digital certificate )便誕生了 。
當伺服器需要告訴瀏覽器公鑰時,並不是簡單地返回公鑰,而是響應 包含公鑰信息在內的數字證書 。
證書主要包含以下內容:
瀏覽器通過 【頒發機構的公鑰】進行解密驗簽 ,驗簽通過即說明證書的真實性,可以放心取 證書擁有者的公鑰 了。( 常用CA機構的公鑰都已經植入到瀏覽器裡面 )
數字證書只做一件事: 保證 伺服器響應的 公鑰是真實的 。
以上保證了 [瀏覽器⇒伺服器] 是加密的,然而 [伺服器⇒瀏覽器] 卻沒有(上圖第4步);另外一個是 性能問題 ,如果所有數據都使用非對稱加密的話,會消耗較多的伺服器資源,通信速度也會受到較大影響。
HTTPS巧妙地結合了非對稱加密和對稱加密,在保證雙方通信安全的前提下,盡量提升性能。
HTTPS(SSL/TLS)期望 建立安全連接後,通信均使用【對稱加密】 。
建立安全連接的任務就是讓 瀏覽器-伺服器協商出本次連接使用的【對稱加密的演算法和密鑰】 ;協商過程中會使用到【非對稱加密】和數字證書。
特別注意的是:協商的密鑰必須是不容易猜到(足夠隨機的):
其中比較核心的是隨機數r3(pre-master secret),因為之前的r1、r2都是明文傳輸的, 只有r3是加密傳輸 的。至於為什麼需要三個隨機數,可以參考:
以上是一個比較簡單的HTTPS流程,詳細的可以參考文末的引用。
參考資料:
[1] 數字證書應用綜合揭秘
[2] SSL/TLS協議運行機制的概述
[3] 圖解SSL/TLS協議
[4] 《圖解HTTP》