1. 程式人生 > >https、公鑰、私鑰、數字簽名、數字證書

https、公鑰、私鑰、數字簽名、數字證書

原文地址:點選開啟連結

1  序言

今天來聊一聊https 安全傳輸的原理。

在開始之前,我們來虛構兩個人物, 一個是位於中國的張大胖(怎麼又是你?!), 還有一個是位於米國的Bill (怎麼還是你?!)。

這倆哥們隔著千山萬水,通過網路聯絡上了, 兩個人臭味相投,聊得火熱。

此時正值米國大選, 張大胖親切地“致電”Bill, 對米國總統大選的情況表示強烈地關注。 Bill則回電說謝謝關心米國人的事情我們米國人自己做主,不用你們歪果仁瞎操心......

張大胖繼續“致電”說其實我們支援特朗普, 因為希拉里太情緒化,太難打交道了, 我們挺希望看到特朗普上臺這樣米國就會變成 The Divided State of America ......

Bill 回電: 拉倒你吧你, 我們米國的政體有著強大的糾錯性, 雖然有時候發展得慢, 有時候會走上岔路, 但很快就會回到正途,幾百年來穩定得很,不像你們像坐了過山車一樣.....

兩個人越聊越投機,天南地北,海闊天空,還夾雜著不少隱私的話題。

2 總是有一種被偷看的感覺

有一天, Bill 突然意識到: 壞了, 我們的通訊是明文的, 這簡直就是網路上裸奔啊, 任何一個不懷好意的傢伙都可以監聽我們通訊,開啟我們傳送的資料包,窺探我們的隱私啊。

張大胖說: “你不早點說,我剛才是不是把我的微訊號給你發過去了? 我是不是告訴你我上週去哪兒旅遊了?   估計已經被人截取了吧!”

Bill  提議: “要不我們做個數據的加密? 每次傳輸之前, 你把訊息用一個加密演算法加密, 然後發到我這裡以後我再解密, 這樣別人就無法偷窺了,像這樣: ”

張大胖冰雪聰明,一看就明白了, 這加密和解密演算法是公開的,那個金鑰是保密的, 只有兩人才知道, 這樣生成的加密訊息(密文) 別人就無法得知了。 他說: “Bill 老兄,你生成一個金鑰, 然後把金鑰發給我, 咱們這就開啟加密訊息, 讓那些偷窺狂人們哭去吧!”

(碼農翻身注:這叫對稱加密演算法, 因為加密和解密用的是同一個金鑰)

一炷香功夫過去了, Bill 還是沒有迴音, 張大胖忍不住地催促: “快發啊?!!!”

Bill 終於回覆了: “ 我感覺有一雙眼睛正在虎視眈眈地盯著我們的通話, 如果我把金鑰發給你, 也被他截取了, 那加密豈不白費工夫?”

張大胖沉默了, 是啊, 網路是不安全的, 這金鑰怎麼安全地發過來啊 ? 

“奧,對了,我下週要去米國旅遊,到時候我們見一面,把密碼確定下來,寫到紙上,誰也偷不走, 這不就結了?” 

“哈哈, 這倒是終極解決之道 ”  Bill 笑了, “不過,我不僅僅和你聊天, 我還要和易卜拉欣,阿卜杜拉, 弗拉基米爾,克里斯托夫,瑪格麗特, 橋本龍太郎, 李賢俊, 許木木,郭芙蓉,呂秀才等人通訊, 我總不能打著飛的,滿世界的和人交換密碼吧? ”

張大胖心裡暗自佩服Bill同學的好友竟然遍佈全球,看來他對加密通訊的要求更加強烈啊!

可是這個加密解密演算法需要的金鑰雙方必須得知道啊, 但是金鑰又無法通過網路傳送, 這該死的偷窺者!

3  RSA : 非對稱加密

Bill 和 張大胖的通訊無法加密,說話謹慎了不少, 直到有一天, 他們聽說了一個叫做RSA的非對稱加密演算法,一下子來了靈感。

這個RSA演算法非常有意思,它不是像之前的演算法, 雙方必須協商一個保密的金鑰, 而是有一對兒鑰匙, 一個是保密的,稱為私鑰,另外一個是公開的,稱為公鑰

更有意思的是,用私鑰加密的資料,只有對應的公鑰才能解密,用公鑰加密的資料, 只有對應的私鑰才能解密。

有了這兩個漂亮的特性, 當張大胖給Bill發訊息的時候, 就可以先用Bill的公鑰去加密(反正Bill的公鑰是公開的,地球人都知道), 等到訊息被Bill 收到後, 他就可以用自己的私鑰去解密(只有Bill才能解開,私鑰是保密的 )

反過來也是如此, 當Bill 想給張大胖發訊息的時候,就用張大胖的公鑰加密, 張大胖收到後,就用自己的私鑰解密。

這樣以來,通訊安全固若金湯, 沒有任何人能窺探他們的小祕密了。

4 非對稱加密+對稱加密

兩人實驗了幾次,  張大胖說: “Bill  , 你有沒有感覺這個RSA的加密和解密有點慢啊?”

Bill嘆了口氣 :“是啊, 我也注意到了, 剛才搜了一下,這個RSA演算法比之前的對稱金鑰演算法要慢上百倍。我們就是加個密而已,現在搞得都沒法用了”

“回到咱們最初的問題,我們想用一個金鑰來加密通訊,那個對稱加密演算法是非常快的,但是苦於金鑰無法安全傳輸, 現在有了RSA ,我想可以結合一下, 分兩步走 (1) 我生成一個對稱加密演算法的金鑰, 用RSA的方式安全發給你,  (2) 我們隨後就不用RSA了, 只用這個金鑰,利用對稱加密演算法來通訊,  如何?   ”

Bill 說: “你小子可以啊, 這樣以來既解決了金鑰的傳遞問題, 又解決了RSA速度慢的問題,不錯。” 

於是兩人就安全地傳遞了對稱加密的金鑰, 用它來加密解密,果然快多了!

5 中間人攻擊

張大胖把和Bill 聊天的情況給老婆彙報了一次。

老婆告誡他說: “你要小心啊, 你確定網路那邊坐著的確實是Bill ?”

張大胖著急地辯解說:“肯定是他啊,我都有他的公鑰,我們倆的通訊都是加密的。”

老婆提醒道:"假如啊,Bill給你發公鑰的時候, 有個中間人,截取了Bill的公鑰, 然後把自己的公鑰發給了你,冒充Bill ,你發的訊息就用中間人的公鑰加了密, 那中間人不就可以解密看到訊息了?"

張大胖背後出汗了,是啊,這個中間人解密以後,還可以用Bill的公鑰加密,發給Bill ,  Bill和我根本都意識不到, 還以為我們在安全傳輸呢!

看來問題出現在公鑰的分發上!  雖然這個東西是公開的, 但是在別有用心的人看來,擷取以後還可以幹壞事 !

6 你到底是誰?

但是怎麼安全地分發公鑰呢? 似乎又回到了最初的問題: 怎麼安全的保護金鑰?

可是似乎和最初的問題還不一樣,這一次的公鑰不用保密,但是一定得有個辦法宣告這個公鑰確實是Bill的, 而不是別人的。

怎麼宣告呢?

張大胖突然想到: 現實中有公證處,它提供的公證材料大家都信任,那在網路世界也可以建立一個這樣的具備公信力的認證中心, 這個中心給大家頒發一個證書, 用於證明一個人的身份。

這個證書裡除了包含一個人的基本資訊之外,還有包括最關鍵的一環:這個人的公鑰!

這樣以來我拿到證書就可以安全地取到公鑰了 ! 完美!

可是Bill 馬上潑了一盆冷水:證書怎麼安全傳輸? 要是證書傳遞的過程中被篡改了怎麼辦?

張大胖心裡不由地咒罵起來: 我操, 這簡直就是雞生蛋,蛋生雞的問題啊。

天無絕人之路, 張大胖很快就找到了突破口: 數字簽名。

簡單來講是這樣的, Bill可以把他的公鑰和個人資訊用一個Hash演算法生成一個訊息摘要, 這個Hash演算法有個極好的特性,只要輸入資料有一點點變化,那生成的訊息摘要就會有鉅變,這樣就可以防止別人修改原始內容。

可是作為攻擊者的中間人笑了: “雖然我沒辦法改公鑰,但是我可以把整個原始資訊都替換了, 生成一個新的訊息摘要, 你不還是辨別不出來?”

張大胖說你別得意的太早 , 我們會讓有公信力的認證中心(簡稱CA)用它的私鑰對訊息摘要加密,形成簽名:

這還不算, 還把原始資訊和資料簽名合併, 形成一個全新的東西,叫做“數字證書

張大胖接著說:當Bill把他的證書發給我的時候, 我就用同樣的Hash 演算法, 再次生成訊息摘要,然後用CA的公鑰對數字簽名解密, 得到CA建立的訊息摘要, 兩者一比,就知道有沒有人篡改了!

如果沒人篡改, 我就可以安全的拿到Bill的公鑰嘍,有了公鑰, 後序的加密工作就可以開始了。

雖然很費勁, 但是為了防範你們這些偷窺者,實在是沒辦法啊。

中間人惡狠狠地說: “算你小子狠! 等著吧,我還有別的招。 對了,我且問你, 你這個CA的公鑰怎麼拿到? 難道不怕我在你傳輸CA公鑰的時候發起中間人攻擊嗎? 如果我成功的偽裝成了CA,你這一套體系徹底玩完。”

張大胖語塞了,折騰了半天,又回到了公鑰安全傳輸的問題!

不過轉念一想,想解決雞生蛋,蛋生雞的問題必須得打破這個怪圈才行,我必須得信任CA,並且通過安全的的方式獲取他們的公鑰,這樣才能把遊戲玩下去。

(公眾號碼農翻身注:這些CA本身也有證書來證明自己的身份,並且CA的信用是像樹一樣分級的,高層的CA給底層的CA做信用背書,而作業系統/瀏覽器中會內建一些頂層的CA的證書,相當於你自動信任了他們。 這些頂層的CA證書一定得安全地放入作業系統/瀏覽器當中,否則世界大亂。)

7  https 

終於可以介紹https了,前面已經介紹了https的原理, 你把張大胖替換成瀏覽器, 把Bill 替換成某個網站就行了。

一個簡化的(例如下圖沒有包含Pre-Master Secret)https流程圖是這樣的, 如果你理解了前面的原理,這張圖就變得非常簡單:

根證書

    根證書是CA認證中心給自己頒發的證書,是信任鏈的起始點。安裝根證書意味著對這個CA認證中心的信任。 

總結

    根據非對稱密碼學的原理,每個證書持有人都有一對公鑰和私鑰,這兩把金鑰可以互為加解密。公鑰是公開的,不需要保密,而私鑰是由證書持人自己持有,並且必須妥善保管和注意保密。

數字證書則是由證書認證機構(CA)對證書申請者真實身份驗證之後,用CA的根證書對申請人的一些基本資訊以及申請人(一般為網站伺服器)的公鑰進行簽名(相當於加蓋發證書機構的公章)後形成的一個數字檔案。CA完成簽發證書後,會將證書釋出在CA的證書庫(目錄伺服器)中,任何人都可以查詢和下載,因此數字證書和公鑰一樣是公開的,但是隻有通過在申請ssl證書時拿到的私鑰才能解密。

    可以這樣說,數字證書就是經過CA認證過的公鑰,而私鑰一般情況都是由證書持有者在自己本地生成的,由證書持有者自己負責保管。具體使用時,簽名操作是傳送方用私鑰進行簽名,接受方用傳送方證書來驗證簽名;加密操作則是用接受方的證書進行加密,接受方用自己的私鑰進行解密。

補充:

    公鑰是很容易得到的分發,它有很多副本,而私鑰呢,就一把,在你自己那兒。如果用私鑰解密了一份用你的公鑰加密的檔案,那麼你是沒有辦法知道很確切的人的,因為你的公鑰副本很多(對方是可以抵賴的),但是對應的,也只有你能解密這個檔案,這是私鑰的解密功能。至於簽名就很好理解了,你用你的私鑰加密了一個文字散發出去,內容大家都可以看(有你公鑰的人),但是,誰也沒辦法仿製這份檔案,因為私鑰就你那裡有(如果你的私鑰洩露了,那也不叫私鑰了),所以,你是沒有辦法抵賴的,這就是私鑰的簽名特性。同理就可以看出公鑰是加密和驗證的。另外說一下,用私鑰對一個檔案進行編碼可不叫完全的加密啊,這檔案只要是擁有你公鑰的人都可以開啟並讀取內容的,是沒有安全可言的,公鑰加密(傳送者加密資料給服務端),私鑰認證身份(服務端回覆資料給客戶端,客戶端認證回覆身份)。

相關推薦

幾個例子理解對稱加密與非對稱加密簽名與驗籤數字證書HTTPS加密方式

# 原創,轉載請留言聯絡 為什麼會出現這麼多加密啊,公鑰私鑰啊,簽名啊這些東西呢?說到底還是保證雙方通訊的安全性與完整性。例如小明發一封表白郵件給小紅,他總不希望給別人看見吧。而各種各樣的技術就是為了保障通訊的安全。(本文務必從上到下看) 1.對稱加密與非對稱加密 對稱加密: 對稱加密是

數字簽名數字證書HTTPS

     加密:公鑰加密,私鑰解密      認證:私鑰加密,公鑰解密      如果A給B傳送一個加密的有數字簽名的檔案,會怎麼樣呢?      首先A有自己的公鑰和私鑰:A_public_key, A_private_key      B也有自己的公鑰和私鑰:  

https數字簽名數字證書

原文地址:點選開啟連結 1  序言 今天來聊一聊https 安全傳輸的原理。 在開始之前,我們來虛構兩個人物, 一個是位於中國的張大胖(怎麼又是你?!), 還有一個是位於米國的Bill (怎麼還是你?!)。 這倆哥們隔著千山萬水,通過網路聯絡上了, 兩個人臭味相投,聊

HTTPS演化過程(對稱加密非對稱加密數字簽名數字證書

主要感謝《碼農翻身》,還有網上的文章,大家可以看看這本書。 1.對稱資料加密 就像上圖所示, 這加密和解密演算法是公開的,那個金鑰是保密的, 只有兩人才知道, 這樣生成的加密訊息(密文) 別人就無法得知了。這叫對稱加密演算法,因為加密和解密用

加密解密數字簽名驗證等概念理解 - 超簡單

公鑰加密(public key)和 私鑰解密(private key) 假設一下,我找了兩個數字,一個是1,一個是2。我喜歡2這個數字,就保留起來,不告訴你們(私鑰),然後我告訴大家,1是我的公鑰。 我有一個檔案,不能讓別人看,我就用1加密了。別人找到了這個檔案,但是他不知道2就是解密的私鑰啊,所以他解不

C#實現RSA加密解密加密解密以及Pcks12X509證書加解密簽名驗籤

RSA的私鑰簽名公鑰驗籤可以見http://blog.csdn.net/starfd/article/details/51917916,所以這裡就沒提供對應程式碼,具體程式碼如下: using Org.BouncyCastle.Asn1; using Org.B

HTTPS詳解

1.公鑰與私鑰原理 1)鮑勃有兩把鑰匙,一把是公鑰,另一把是私鑰 2)鮑勃把公鑰送給他的朋友們—-帕蒂、道格、蘇珊—-每人一把。 3)蘇珊要給鮑勃寫一封保密的信。她寫完後用鮑勃的公鑰加密,就可以達到保密的效果。 4)鮑勃收信後,用私鑰解密,就

和加簽與驗簽

然而 指定 簽名 判斷 總結 使用 感覺 現在 得到 在公司查問題時遇到一個關於公鑰與私鑰和加簽與驗簽的問題,當時不太明白,後來弄明白了感覺挺有意思的,所以想分享一下。   為了說明問題,假設現在有a,b,c三家公司,彼此都有業務往來。   假設a,b公司都會向c公司發送報

JAVA代碼-數字證書公私生成-cer ,jks, pfx格式

else generator actor issue 自己 bytearray 私鑰 公私鑰 throws import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStre

Centos 7 利用,免密碼登錄

字符 http images 輸入 shel 文件 src ssp height 1.生成公鑰和私鑰    ssh-keygen -t rsa      建議:生成公鑰和私鑰時,輸入passphrase(不能少於5個字符) 2.修改ssh配置文件   vi /etc

給我一對,我就能破解此RSA

logs 計算 mar == while clas 需要 最終 最大公約數 RSA密碼系統如果暴露了一套公鑰和私鑰,那麽這套密碼系統就全部失效了。因為根據公鑰和私鑰可以完成大整數的分解、暴露了兩個質數。 記公鑰為e,私鑰為d,因為ed%phi=1,所以就得到了一個k=ed-

Git簡單生成生成方法

wap .com strong file art 代碼 秘鑰 ron div Git配置 Git安裝完之後,需做最後一步配置。打開git bash,分別執行以下兩句命令 git config --global user.name “用戶名” git config --

,數字簽名

bsp AC blog nbsp class hash OS 數據安全 log client (有w的公鑰) < --------------------------------------------------->

加密—簽名

網上 成了 清晰 麻省理工 因式分解 ora 出現 target 速度 轉載文章:https://www.cnblogs.com/welhzh/p/5894496.html 本文為大叔轉載的,寫的挺好,清晰易懂! 一、公鑰加密假設一下,我找了兩串數字,一串是1*,一串是

網絡數據傳輸安全之

加密算法 加密解密過程數據在互聯網上傳輸過程中存在三個隱患:安全性:數據在傳輸過程中內容可能泄露。完整性:數據在傳輸過程中可能被篡改。身份認證:接受數據的一方很難確認發送者的身份。針對這三種隱患科研人員設計了多種對數據加密的算法,著名的算法有如下幾種:單項加密法:此方法不可解密,很好的解決了數據的完整性,它的

在OpenSSH上采用登錄並設置代理登錄

lis 0.10 需要 密鑰驗證 客戶 png 客戶機 文件 重啟 驗環境:RHEL6.5版本兩臺 客戶機IP地址 192.168.100.222 服務器IP地址 192.168.100.100 兩臺linux能實現相互通信 ------------------------

Linux

宋體 pan 保存 mage ans 文件的 意思 lib vpd 生成一個私鑰可以將私鑰保存到文件中,而且這個文件只能自己訪問到。所以需要修改私鑰文件的權限小括號的意思就是在當前子shell進程中有效。生成一個公鑰公鑰是從私鑰從提取並生成的Linux 公鑰與私鑰

加密,認證疑難名詞總結----RSA, ,CA,數字簽名數字證書

成功 digital 出現 直觀 證明 col 文件簽名 nat blog 在網絡和操作系統安全通信中經常涉及到這幾個名詞: RSA, 公鑰,私鑰,CA,數字簽名,數字證書。我找了很多資料,很少有把疑難點講全面的。但不講清楚這幾個,很難有一個清晰的認識和理解。我現在也嘗試這

(轉載)我理解的數字證書-1-數字證書

rsa加密算法 流程 employ alice 人的 無法 什麽是 作者 alt 原文地址:https://www.cnblogs.com/hthf/p/4986507.html 英文原文地址: http://www.youdzone.com/signature.h

如何使用openssl生成RSA

在ubuntu上要使用openssl的話需要先進行安裝,命令如下: sudo apt-get install openssl 安裝完成就可以使用openssl了。 首先需要進入openssl的互動介面,在命令行了輸入openssl即可; 1)生成RSA私鑰: