日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

对称加密和非对称加密、公钥和私钥、单向认证和双向认证、数字签名、数字证书、根证书

發(fā)布時(shí)間:2023/11/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对称加密和非对称加密、公钥和私钥、单向认证和双向认证、数字签名、数字证书、根证书 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 1. 什么是公鑰和私鑰?
  • 2. 加密算法
    • 2.1 對(duì)稱加密
    • 2.2 非對(duì)稱加密
      • 2.2.1 非對(duì)稱加密的重要性質(zhì)
      • 2.2.2 非對(duì)稱加密算法應(yīng)用
        • 2.2.2.1 應(yīng)用1 加密通信
          • 2.2.2.1.1 單向認(rèn)證和雙向認(rèn)證
        • 2.2.2.1 應(yīng)用2 數(shù)字簽名
  • 3. 數(shù)字簽名
    • 3.1 數(shù)字簽名用法演示
      • 3.1.1 最簡(jiǎn)單用法(校驗(yàn)數(shù)據(jù)的完整性)
      • 2.1.2 復(fù)雜用法(校驗(yàn)數(shù)據(jù)的完整性)
    • 3.2 數(shù)字簽名存在問題
  • 4. 數(shù)字證書(Digital Certificate)
    • 4.1 創(chuàng)建數(shù)字證書
      • 4.1.1 舉例,CA如何給我們簽發(fā)一個(gè)有效證書和服務(wù)器如何發(fā)送證書:
    • 4.2 數(shù)字證書究竟解決了什么問題
      • 4.2.1 如何攻擊數(shù)字證書呢
  • 參考:

1. 什么是公鑰和私鑰?

摘自《什么是公鑰和私鑰?》

公鑰(Public Key)與私鑰(Private Key)是通過(guò)加密算法得到的一個(gè)密鑰對(duì)(即一個(gè)公鑰和一個(gè)私鑰,也就是非對(duì)稱加密方式)。

公鑰可對(duì)會(huì)話進(jìn)行加密、驗(yàn)證數(shù)字簽名,只有使用對(duì)應(yīng)的私鑰才能解密會(huì)話數(shù)據(jù),從而保證數(shù)據(jù)傳輸?shù)陌踩浴9€是密鑰對(duì)外公開的部分,私鑰則是非公開的部分,由用戶(一般是服務(wù)端)自行保管。

公鑰和私鑰起初均存儲(chǔ)在服務(wù)器端。 私鑰是非公開的,因此僅存放在服務(wù)端,而且要避免被竊取,比如存在某網(wǎng)站A的服務(wù)器端;公鑰是大家都可以獲取的,一般是用在客戶端,客戶端的公鑰是從哪來(lái)的呢?需要從服務(wù)器端獲得,比如瀏覽器就是 一個(gè)客戶端,當(dāng)訪問網(wǎng)站的時(shí)候,需要通過(guò)握手協(xié)議從網(wǎng)站側(cè)獲取

通過(guò)加密算法得到的密鑰對(duì)可以保證在世界范圍內(nèi)是唯一的。使用密鑰對(duì)的時(shí)候,如果用其中一個(gè)密鑰加密一段數(shù)據(jù),只能使用密鑰對(duì)中的另一個(gè)密鑰才能解密數(shù)據(jù)。例如:用公鑰加密的數(shù)據(jù)必須用對(duì)應(yīng)的私鑰才能解密;如果用私鑰進(jìn)行加密也必須使用對(duì)應(yīng)的公鑰才能解密,否則將無(wú)法成功解密。

2. 加密算法

摘自:《什么是非對(duì)稱加密?》

密碼學(xué)中有兩種技術(shù):一種叫對(duì)稱加密,另外一種叫非對(duì)稱加密。

這次咱們主要聊聊非對(duì)稱加密,因?yàn)楣€和私鑰就是非對(duì)稱加密的成果,但是為了更好的理解非對(duì)稱加密,我們也會(huì)簡(jiǎn)單介紹對(duì)稱加密

2.1 對(duì)稱加密

采用單鑰密碼系統(tǒng)的加密方法,同一個(gè)密鑰可以同時(shí)用作信息的加密和解密,這種加密方法稱為對(duì)稱加密,也稱為單密鑰加密。

在對(duì)稱加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。

基本邏輯是這樣。如果 Alice 想把一個(gè)信息傳遞給 Bob 。比如信息是一個(gè)數(shù)字 m ,Alice 不能把這個(gè)數(shù)字直接傳遞給 Bob ,因?yàn)榛ヂ?lián)網(wǎng)是一個(gè)不安全的環(huán)境,很容易被竊聽。所以她可以通過(guò)一個(gè)加密算法,比如,通過(guò)給 m 加上一個(gè)數(shù)字 e ,得到一個(gè)數(shù)字 c ,這個(gè) c 就叫做密文。這樣 Bob 拿到密文 c ,再減去 e 就可以得到信息 m 了。


因此,e就是對(duì)稱加密算法中的密鑰,并且只存在私鑰,沒有公鑰概念。發(fā)送消息和接收消息二者持有的密鑰是相同的。簡(jiǎn)單來(lái)說(shuō),對(duì)稱加密就是加密與解密的步驟或方法完全對(duì)稱,只需把步驟逆過(guò)來(lái)就行,與非對(duì)稱加密相比,這里加密和解密步驟是簡(jiǎn)單的逆過(guò)來(lái),因此只使用一種是密鑰就可以實(shí)現(xiàn)。

比如,想要傳遞的 m 等于2,e 等于1,那么2+1得到密文就是3,3傳遞給 Bob 之后,Bob 用3-1得到信息 m 了。這個(gè)過(guò)程中,密文是可以放心的在互聯(lián)網(wǎng)上傳播的,被竊聽了也沒人能看懂。e 就是密鑰,密鑰如果一旦泄露了,通信過(guò)程就不安全了。當(dāng)然實(shí)際中加密算法以及密鑰都必須很復(fù)雜,不是簡(jiǎn)單的加一個(gè)數(shù)字,因?yàn)楝F(xiàn)在人們的解密手段其實(shí)也已經(jīng)非常高超了。

對(duì)稱加密的優(yōu)勢(shì)是可以加密大段信息,這個(gè)是非對(duì)稱加密做不到的,但是對(duì)稱加密的問題在于如何能夠安全的把密鑰傳遞給對(duì)方。因?yàn)槿绻?Alice 不能安全的把密鑰傳遞給 Bob ,那么加密通信就實(shí)現(xiàn)不了。而如果不能實(shí)現(xiàn)加密通信,那又怎么可能安全的傳遞密鑰呢,所以對(duì)稱加密在互聯(lián)網(wǎng)上使用,就有了這個(gè)雞生蛋蛋生雞的問題。非對(duì)稱加密被發(fā)明出來(lái),就是為了解決對(duì)稱加密的這個(gè)最為致命的痛點(diǎn)。

舉例說(shuō)明對(duì)稱加密密鑰傳輸?shù)膯栴}:
由于單鑰加密,同一個(gè)密鑰既能加密,也能解密,那么必須謹(jǐn)慎的傳播密鑰,如果Alice 想把一個(gè)信息傳遞給 Bob ,用到了對(duì)稱加密,那么密鑰必須做到除了Alice和Bob之外,不能有第三個(gè)人知道。問題是如果Alice把密鑰(其實(shí)就是一個(gè)字符串)拷貝到U盤,親手把U盤拿給Bob,Bob再拷貝進(jìn)電腦,這樣是很安全的或者打電話也行,但是有沒有考慮到網(wǎng)站對(duì)N個(gè)訪問端,難道網(wǎng)站的開發(fā)者一個(gè)個(gè)的送U盤嗎?顯然不可取。但是如果直接通過(guò)網(wǎng)絡(luò)發(fā)送密鑰,很容易被竊取。

2.2 非對(duì)稱加密

非對(duì)稱加密也稱公鑰加密算法!

非對(duì)稱加密之所以不對(duì)稱,指的就是加密用一個(gè)密鑰,而解密的時(shí)候用的是另外一個(gè)密鑰。因此,我們稱之為公鑰和私鑰,顧名思義,公鑰可以任意對(duì)外發(fā)布;而私鑰必須由用戶自行嚴(yán)格秘密保管,絕不透過(guò)任何途徑向任何人提供,也不會(huì)透露給要通信的另一方,即使他被信任。

2.2.1 非對(duì)稱加密的重要性質(zhì)

1.加密的雙向性。

加密具有雙向性,即公鑰和私鑰中的任一個(gè)均可用作加密,此時(shí)另一個(gè)則用作解密。

公鑰加密,私鑰解密;
私鑰加密,公鑰解密;
公鑰加密,公鑰無(wú)法解密!

2.公鑰無(wú)法推導(dǎo)出私鑰

必須確保使用公鑰無(wú)法推導(dǎo)出私鑰,至少妄想使用公鑰推導(dǎo)私鑰必須在計(jì)算上是不可行的,否則安全性將不復(fù)存在。

雖然兩個(gè)密鑰在數(shù)學(xué)上相關(guān),但如果知道了公鑰,并不能憑此計(jì)算出私鑰;因此公鑰可以公開,任意向外發(fā)布;而私鑰不公開,絕不透過(guò)任何途徑向任何人提供。

2.2.2 非對(duì)稱加密算法應(yīng)用

2.2.2.1 應(yīng)用1 加密通信

這個(gè)過(guò)程是這樣的。Bob 作為接收信息的一方,首先要生成一對(duì)密鑰,一個(gè)叫做公鑰,意思就是可以公開出去的密鑰。另外一個(gè)叫做私鑰,也就是要私密保存的。

注意:這個(gè)場(chǎng)景特指bob作為接收方,不是發(fā)送方!確切來(lái)說(shuō),這個(gè)是單向認(rèn)證的例子。在單向認(rèn)證的場(chǎng)景下,如果bob作為發(fā)送方的話,只能用私鑰加密(這樣公鑰可以解密),這樣接收方張三李四都持有公鑰的話,可以互相竊取消息進(jìn)行解密,這樣是不安全的,本來(lái)發(fā)給張三的消息,李四可以竊取。如果要解密此問題,就要用到雙向認(rèn)證!

注意這一對(duì)兒密鑰是有天然的數(shù)學(xué)聯(lián)系的,不然也不可能用公鑰加密后能用私鑰解密。具體這個(gè)聯(lián)系是什么,可以參考 RSA 算法 ,我們這里就不展開了。接下來(lái),Bob 把自己的公鑰傳遞給 Alice ,Alice 用 Bob 的公鑰去加密信息 m 得到密文 c 。Bob 拿到密文 c 之后,用私鑰解c得到m,注意這里就體現(xiàn)出來(lái)不對(duì)稱了,因?yàn)?Bob 解密用的不是公鑰,而是自己的私鑰。

咱們思考一下這個(gè)過(guò)程里面的安全性。暴露在互聯(lián)網(wǎng)上的首先是公鑰,然后是密文,非對(duì)稱加密的算法本身是公開的。但是即使公鑰和密文算法都被攻擊者拿到,他也不能解密拿到信息的(因?yàn)橹荒苡盟借€解,私鑰僅被Bob 持有)。所以整個(gè)過(guò)程是安全的。

甲方只能用其私鑰解密由其公鑰加密后的任何信息。 非對(duì)稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要。

2.2.2.1.1 單向認(rèn)證和雙向認(rèn)證

前文2.2.2.1 應(yīng)用1 加密通信提到單向認(rèn)證和雙向認(rèn)證概念,我們來(lái)分析下:

這個(gè)場(chǎng)景特指bob作為接收方,不是發(fā)送方!確切來(lái)說(shuō),這個(gè)是單向認(rèn)證的例子。在單向認(rèn)證的場(chǎng)景下,bob制作私鑰和公鑰,發(fā)布公鑰,作為消息接收方,是安全的;

如果bob作為發(fā)送方的話,只能用私鑰加密(為了保證接收方可以用公鑰進(jìn)行解密),這樣接收方張三李四都持有公鑰的話,可以互相竊取消息進(jìn)行解密,這樣是不安全的,本來(lái)發(fā)給張三的消息,李四可以竊取。

如果要解決此問題,就要用到雙向認(rèn)證!

此時(shí)張三也制作私鑰和公鑰,持有私鑰,并把公鑰發(fā)布給bob,如果bob想發(fā)消息給張三,就用張三提供的公鑰加密,張三收到消息后,用張三的私鑰進(jìn)行解碼,這樣,李四即使獲得bob的公鑰、張三的公鑰、bob發(fā)給張三的消息,也無(wú)法解密!

2.2.2.1 應(yīng)用2 數(shù)字簽名

非對(duì)稱加密的另一個(gè)重要應(yīng)用:數(shù)字簽名

我們會(huì)在數(shù)字簽名章節(jié)單獨(dú)講述

3. 數(shù)字簽名

數(shù)字簽名(又稱公鑰數(shù)字簽名)是只有信息的發(fā)送者才能產(chǎn)生的別人無(wú)法偽造的一段數(shù)字串,這段數(shù)字串同時(shí)也是對(duì)信息的發(fā)送者發(fā)送信息真實(shí)性的一個(gè)有效證明。

它是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領(lǐng)域的技術(shù)來(lái)實(shí)現(xiàn)的,用于鑒別數(shù)字信息的方法。

一套數(shù)字簽名通常定義兩種互補(bǔ)的運(yùn)算,一個(gè)用于簽名,另一個(gè)用于驗(yàn)證。數(shù)字簽名是非對(duì)稱密鑰加密技術(shù)與數(shù)字摘要技術(shù)的應(yīng)用。

是不是有點(diǎn)模糊,沒關(guān)系,舉了例子就立馬清晰了。

在<2.2.2.1 應(yīng)用1 加密通信>章節(jié)講訴的例子,Alice 發(fā)送消息給bob,那么如果張三也發(fā)消息給bob的話,那么,bob如何區(qū)分消息的發(fā)送者是Alice 還是張三呢?簡(jiǎn)單,加個(gè)數(shù)字簽名就行了!

數(shù)字簽名就像我們寫在信上的簽名,是消息內(nèi)容主體之外的另一個(gè)信息。

由定義可知數(shù)字簽名的作用包含2種:

a)驗(yàn)證數(shù)據(jù)來(lái)源。

b)驗(yàn)證數(shù)據(jù)完整性。

報(bào)文摘要:
數(shù)字簽名會(huì)用到報(bào)文摘要技術(shù),我們先來(lái)介紹下報(bào)文摘要。

報(bào)文摘要:將報(bào)文按雙方約定的HASH算法計(jì)算得到一個(gè)固定位數(shù)的報(bào)文摘要。在數(shù)學(xué)上保證只要改動(dòng)報(bào)文中任何一位,重新計(jì)算出的報(bào)文摘要值就會(huì)與原先的值不相符。這樣就保證了報(bào)文的不可更改性。

假如將一段報(bào)文“abcd”進(jìn)行摘要計(jì)算,其hash值為"efgh",反復(fù)計(jì)算多次,其結(jié)果必然一致。一旦改動(dòng)后,其值必不一致,如果將第一個(gè)字母a篡改為’y’,那么其結(jié)果必然不等于"efgh",因此,利用這種特性,可以用來(lái)驗(yàn)證內(nèi)容是否被篡改。

將該報(bào)文摘要值用發(fā)送者的私鑰加密就得到報(bào)文的數(shù)字簽名。

總結(jié)來(lái)說(shuō):
F(M) = D E(D)=S
F是單向散列函數(shù):即如果已知x,很容易計(jì)算F(x),但已知F(x),卻很難算出x

數(shù)字簽名就是用私鑰將摘要加密的結(jié)果,這樣能夠保證數(shù)據(jù)的完整性、放篡改、以及不可抵賴性。


由上圖,基于明文,采用單向哈希算法,可以得到摘要H,用發(fā)送方(甲方)的私鑰進(jìn)行加密后,得到一個(gè)數(shù)字簽名。將來(lái)用甲方的公鑰解開數(shù)字簽名,就能得到H

3.1 數(shù)字簽名用法演示

數(shù)字簽名的作用包含2種:

a)驗(yàn)證數(shù)據(jù)來(lái)源。

b)驗(yàn)證數(shù)據(jù)完整性。

我們僅展示驗(yàn)證數(shù)據(jù)完整性。

3.1.1 最簡(jiǎn)單用法(校驗(yàn)數(shù)據(jù)的完整性)

乙方把接收到的發(fā)送方的明文用單向哈希函數(shù)取得摘要值后,與甲方的公鑰解密甲方的數(shù)字簽名而得到的摘要值進(jìn)行比較,如果一樣說(shuō)明信息完整,未受篡改,如果不一樣說(shuō)明受到篡改。

這里假設(shè)明文不經(jīng)處理,和簽名直接發(fā)送給乙方,并且乙方持有甲方的公鑰。

2.1.2 復(fù)雜用法(校驗(yàn)數(shù)據(jù)的完整性)

與前面的相比,這里的復(fù)雜之處在于明文也會(huì)被加密,多了一個(gè)步驟,需要用私鑰先把密文解析為明文,其余步驟相同

應(yīng)用數(shù)字簽名時(shí),需要發(fā)送者,例如Alice ,也需要生成一對(duì)密鑰,一個(gè)公鑰,一個(gè)私鑰。公鑰發(fā)布給bob,私鑰要私藏。

簡(jiǎn)單解釋,把A對(duì)應(yīng)Alice ,B對(duì)應(yīng)bob:

A:將明文Text進(jìn)行摘要運(yùn)算后得到摘要(消息完整性)H,再將摘要H用A的私鑰加密(身份認(rèn)證),得到數(shù)字簽名S,將密文M(用B的公鑰對(duì)明文加密)和數(shù)字簽名S一塊發(fā)給B。

注意:1.數(shù)字簽名是用Alice 的私鑰,因此任何人都能獲取Alice 的公鑰,把數(shù)字簽名S解密
2.密文是用bob的公鑰,M無(wú)法被第三方破解,因此只有bob有私鑰才能解,也就是說(shuō)密文可以替換成亂七八糟的,但是無(wú)法篡改,因?yàn)闆]有辦法獲取原文,怎么改其中的一個(gè)字符?
3.數(shù)字簽名包含摘要運(yùn)算,這個(gè)摘要的值是為了驗(yàn)證密文是否被替換的,原理是即如果已知x,很容易計(jì)算F(x),多次計(jì)算結(jié)果不變。如果密文被改了,那么2次結(jié)算結(jié)果就不同。

B:

  • 收到A的消息后,先將密文 M’(密文可能被篡改,因此多個(gè)一個(gè)單引號(hào),因?yàn)槭褂玫墓€加密的,因此,張三也可以獲得公鑰,可以偽造一段自己產(chǎn)生的明文,也用公鑰加密后,替換原有消息中的密文) 用自己的私鑰解密,得到明文 Text’。

  • 將數(shù)字簽名用A的公鑰進(jìn)行解密后,得到原有的摘要H(簽名是A的私鑰,無(wú)法被修改,因此解密成功則說(shuō)明A的身份被認(rèn)證了,并且其內(nèi)容就是之前的那個(gè)摘要H)。

  • ? ? 對(duì)明文Text’再次進(jìn)行摘要運(yùn)算,得到實(shí)際收到的摘要H’,將兩份摘要進(jìn)行對(duì)比,如果H=H’,則說(shuō)明Text=Text’,消息沒有被篡改(消息完整性),反之,說(shuō)明消息內(nèi)容被改過(guò)了。

  • 一舉兩得,既能驗(yàn)證身份,又能驗(yàn)證消息的完整性。

    3.2 數(shù)字簽名存在問題

    數(shù)字簽名存在問題:中間人攻擊

    中間人攻擊(Man-in-the-MiddleAttack,簡(jiǎn)稱“MITM攻擊”)是指攻擊者與通訊的兩端分別創(chuàng)建獨(dú)立的聯(lián)系,并交換其所收到的數(shù)據(jù),使通訊的兩端認(rèn)為他們正在通過(guò)一個(gè)私密的連接與對(duì)方 直接對(duì)話,但事實(shí)上整個(gè)會(huì)話都被攻擊者完全控制。在中間人攻 擊中,攻擊者可以攔截通訊雙方的通話并插入新的內(nèi)容。中間人攻擊是一個(gè)(缺乏)相互認(rèn)證的攻擊。大多數(shù)的加密協(xié)議都專門加入了一些特殊的認(rèn)證方法以阻止中間人攻擊。例如,SSL協(xié)議可以驗(yàn)證參與通訊的一方或雙方使用的證書是否是由權(quán)威的受信 任的數(shù)字證書認(rèn)證機(jī)構(gòu)頒發(fā),并且能執(zhí)行雙向身份認(rèn)證。

    把A對(duì)應(yīng)Alice ,B對(duì)應(yīng)bob,A要發(fā)信息給B:

    B如何安全的把自己的公鑰發(fā)布給A,如果C截獲B與A之間通信,把B的公鑰換成C的公鑰發(fā)給A,然后C冒充B與A進(jìn)行通信,這個(gè)時(shí)候A是不知道他收到的數(shù)據(jù)是來(lái)自C的,可以實(shí)現(xiàn)中間人攻擊。

    A收到C發(fā)送的消息不可怕,可怕的是A外發(fā)消息時(shí),會(huì)用C的公鑰加密,B在和壞人通信,B輸入的密碼等信息都被壞人用私鑰解密而截獲了。

    那么這里就要保證、不要使用壞人的公鑰加密,那么怎么知道將要訪問的網(wǎng)站的真正公鑰,而不是被壞人替換了假的公鑰呢?為了解決這個(gè)問題就出現(xiàn)了證書。

    注意:中間人攻擊的特點(diǎn)是截獲并替換,可以理解是在網(wǎng)絡(luò)的中間替換,并不能替換已經(jīng)下載至本地的正確的公鑰,后者屬于物理替換,比如中病毒了或機(jī)器被遠(yuǎn)程控制了才可以。為什么這么說(shuō),是因?yàn)椤稊?shù)字簽名是什么?》作者阮一峰 (當(dāng)然好多別的網(wǎng)站也有,畢竟都是翻譯國(guó)外的)里面提到:

    復(fù)雜的情況出現(xiàn)了。道格想欺騙蘇珊,他'偷偷使用了蘇珊的電腦,用自己的公鑰換走了鮑勃的公鑰。' 此時(shí),蘇珊實(shí)際擁有的是道格的公鑰,但是還以為這是鮑勃的公鑰。因此,道格就可以冒充鮑勃, 用自己的私鑰做成"數(shù)字簽名",寫信給蘇珊,讓蘇珊用假的鮑勃公鑰進(jìn)行解密

    這里面提到偷走電腦是非常不恰當(dāng)?shù)?#xff0c;也是導(dǎo)致難以理解數(shù)字證書的根本原因!因?yàn)榧热荒芡底唠娔X了,為何不能替換根證書?這樣后續(xù)就可以替換網(wǎng)絡(luò)中的數(shù)字證書,進(jìn)而替換公鑰了!

    4. 數(shù)字證書(Digital Certificate)

    數(shù)字證書簡(jiǎn)稱CA,它由權(quán)威機(jī)構(gòu)給某網(wǎng)站頒發(fā)的一種認(rèn)可憑證。頒發(fā)證書機(jī)構(gòu)它也有一對(duì)公鑰和私鑰。

    證書機(jī)構(gòu)用它的私鑰將 A的公鑰 和 一些A的信息 加密得到數(shù)字證書。然后A發(fā)送數(shù)據(jù)給B時(shí),包含了三個(gè)部分:原文+數(shù)字簽名+數(shù)字證書

    如果數(shù)字證書是ok的,那么其內(nèi)部存儲(chǔ)的A的公鑰就是ok的。

    4.1 創(chuàng)建數(shù)字證書

    數(shù)字證書=證書內(nèi)容(注意是明文)+數(shù)字簽名

    如何驗(yàn)證內(nèi)容是明文的?你可以嘗試導(dǎo)出一個(gè)二進(jìn)制的證書,用16進(jìn)制查看,發(fā)限標(biāo)記的地方是英文,是簽發(fā)機(jī)構(gòu),說(shuō)明是明文,否則應(yīng)該看不到的:

    Globalsign Root CA是Globalsign的根證書,GlobalSign的根證書是PKI生態(tài)系統(tǒng)中最古老,最受信任的根證書

    數(shù)字證書的結(jié)構(gòu)分為內(nèi)容(類似報(bào)文)+對(duì)內(nèi)容產(chǎn)生的簽名。簽名的作用是為了將來(lái)驗(yàn)證數(shù)字證書的。

    步驟1 : 有一個(gè)權(quán)威的證書簽發(fā)機(jī)構(gòu),稱為CA——全球就那么幾個(gè)公司比較權(quán)威啦,這個(gè)機(jī)構(gòu),先用RSA產(chǎn)生一對(duì)公私鑰。

    私鑰自己留著藏起來(lái),你要是能偷到手就厲害了。

    步驟2: 先生成一個(gè)文件,文件內(nèi)容大概是這樣的:

    • 公鑰內(nèi)容
    • 簽發(fā)者ID—-誰(shuí)簽發(fā)的證書
    • Subject—-也就是這個(gè)證書簽發(fā)給誰(shuí)。
    • 有效期
    • 其他信息

    以上內(nèi)容都是明文。我們稱為內(nèi)容P,具體內(nèi)容如下:

    • 版本號(hào)version為證書的版本標(biāo)識(shí),目前最新版本為v3,若使用擴(kuò)展項(xiàng)時(shí),version=v3。

    • 序列號(hào)serialNumber為證書的唯一標(biāo)識(shí),每張證書的序列號(hào)不同。

    • 簽名算法signatureAlgorithm和證書域中的簽名算法相同。

      就是指的這個(gè)數(shù)字證書的數(shù)字簽名所使用的加密算法,這樣就可以使用證書發(fā)布機(jī)構(gòu)的證書里面的公鑰(公鑰可以支持多種算法,因此需要告知使用具體哪一種),根據(jù)這個(gè)算法對(duì)指紋進(jìn)行解密。指紋的加密結(jié)果就是數(shù)字簽名。

    • 證書的簽發(fā)者issuer是證書的頒發(fā)機(jī)構(gòu),是證書持有者的信任方。

    • 主體subject也是證書持有者,是證書的所屬實(shí)體。

    • 有效期validity包含證書的生效日期和失效日期。

    • 主體公鑰信息subjectPublicKeyInfo表示證書持有者的公鑰信息。

      假設(shè)我們自己的公司叫"ABC Company",我們想申請(qǐng)證書,那么我們自己就要通過(guò)rsa算法生成公司的一對(duì)公鑰和密鑰,并且把公鑰發(fā)送給機(jī)構(gòu),私鑰自己保管

    • 主體唯一標(biāo)識(shí)符subjectUniqueID 證書簽發(fā)的唯一標(biāo)識(shí)

    • 簽發(fā)者唯一標(biāo)識(shí)符issuerUniqueID表示證書持有者的唯一標(biāo)識(shí)。

    • 擴(kuò)展項(xiàng)extensions標(biāo)識(shí)證書的擴(kuò)展信息,可同時(shí)擴(kuò)展多個(gè)信息。

    步驟3: 然后使用hash算法,對(duì)內(nèi)容P進(jìn)行hash計(jì)算,得到一個(gè)摘要H

    步驟4: 然后使用簽發(fā)機(jī)構(gòu)的私鑰對(duì)H進(jìn)行RSA加密,得到簽名信息S。這個(gè)步驟稱為簽名,就是用私鑰對(duì)某公開內(nèi)容的hash值進(jìn)行加密。

    步驟5: 然后將內(nèi)容P,S連成一個(gè)文件,這個(gè)文件就是所謂的數(shù)字證書了。所以數(shù)字證書里,包括證書持有者的身份信息,證書信息,證書持有人的公鑰,以及機(jī)構(gòu)的簽名信息。

    4.1.1 舉例,CA如何給我們簽發(fā)一個(gè)有效證書和服務(wù)器如何發(fā)送證書:

    舉個(gè)例子方便大家理解,假設(shè)我們公司"ABC Company"花了1000塊錢,向一個(gè)證書發(fā)布機(jī)"SecureTrust CA"為我們自己的公司"ABC Company"申請(qǐng)了一張證書。

    注意,這個(gè)證書發(fā)布機(jī)"SecureTrust CA"是一個(gè)大家公認(rèn)并被一些權(quán)威機(jī)構(gòu)接受的證書發(fā)布機(jī)構(gòu),我們的操作系統(tǒng)里面已經(jīng)安裝了"SecureTrust CA"的證書。

    "SecureTrust CA"在給我們發(fā)布證書時(shí),把Issuer,Public key,Subject,Valid from,Valid to等信息以明文的形式寫到證書里面,然后用一個(gè)指紋算法計(jì)算出這些數(shù)字證書內(nèi)容的一個(gè)指紋(這里是指證書上的數(shù)字簽名),并把指紋和指紋算法用自己的私鑰進(jìn)行加密,然后和證書的內(nèi)容一起發(fā)布,同時(shí)"SecureTrust CA"還會(huì)給一個(gè)我們公司"ABC Company"的私鑰給到我們(當(dāng)然建議我們自己公司創(chuàng)建私鑰,把公鑰提供給CA機(jī)構(gòu)比較安全)。

    例子中是公司自己的公鑰私鑰都有ca代辦,當(dāng)然建議我們自己公司創(chuàng)建私鑰,把公鑰提供給CA機(jī)構(gòu)比較安全,因?yàn)镃A發(fā)送私鑰的萬(wàn)一出錯(cuò)呢?或者泄露呢?

    我們花了1000塊錢買的這個(gè)證書的內(nèi)容如下:

    ×××××××××××××××證書內(nèi)容開始×××××××××××××××××Issuer : SecureTrust CASubject : ABC CompanyValid from : 某個(gè)日期Valid to: 某個(gè)日期Public Key : 一串很長(zhǎng)的數(shù)字…… 其它的一些證書內(nèi)容……數(shù)字簽名

    所以最后在我們使用https的時(shí)候究竟發(fā)生了什么:

  • 客戶端向一個(gè)需要https訪問的網(wǎng)站發(fā)起請(qǐng)求。

  • 服務(wù)器將證書發(fā)送給客戶端,證書里面包含了服務(wù)器的公鑰

  • 客戶端對(duì)證書進(jìn)行校驗(yàn)
    這里要特別說(shuō)一下客戶端到底 如何來(lái)校驗(yàn)對(duì)方發(fā)過(guò)來(lái)的數(shù)字證書是否有效:

    • 首先在本地電腦尋找是否有這個(gè)服務(wù)器證書上的ca機(jī)構(gòu)的根證書。如果有繼續(xù)下一步,如果沒有彈出警告。
    • 使用ca機(jī)構(gòu)根證書的公鑰對(duì)服務(wù)器證書的數(shù)字簽名進(jìn)行解密,得到md1。
    • 證書的內(nèi)容是明文的,能得到簽名算法signatureAlgorithm,利用公鑰和相應(yīng)的算法對(duì)明文再次計(jì)算摘要,得到md2。
    • 將md1和md2對(duì)比看是否一樣,如果一樣則通過(guò)認(rèn)證。
  • 校驗(yàn)成功之后,客戶端會(huì)生成一個(gè)隨機(jī)串然后使用服務(wù)器證書的公鑰進(jìn)行加密之后發(fā)送給服務(wù)器。

  • 服務(wù)器通過(guò)使用自己的私鑰解密得到這個(gè)隨機(jī)值。

  • 服務(wù)器從此開始使用這個(gè)隨機(jī)值進(jìn)行對(duì)稱加密開始和客戶端進(jìn)行通信。

  • 客戶端拿到值用對(duì)稱加密方式 使用隨機(jī)值進(jìn)行解密。

  • 為什么不一直使用非對(duì)稱進(jìn)行加密,而是在類似握手之后開始使用對(duì)稱加密算法進(jìn)行https通信:

    非對(duì)稱加密的消耗和所需的計(jì)算以及時(shí)間遠(yuǎn)比對(duì)稱加密消耗要大,所以在握手和認(rèn)證之后,服務(wù)器和客戶端就開始按照約定的隨機(jī)串,對(duì)后續(xù)的數(shù)據(jù)傳輸進(jìn)行加密。A如何把自己的數(shù)字證書發(fā)布給B,如果C截獲A與B之間通信,把A的數(shù)字證書換成C的偽造的數(shù)字證書發(fā)給B,然后冒充A與B進(jìn)行通信,這個(gè)時(shí)候B的根證書持有的CA的公鑰無(wú)法打開數(shù)字證書,說(shuō)明是假的

    總結(jié):
    為了速度起見,客戶端只在建立與服務(wù)器的連接時(shí),使用非對(duì)稱加密(利用數(shù)字證書中的服務(wù)器的公鑰),這個(gè)階段是為了交換一個(gè)共享密鑰。接下來(lái)的過(guò)程使用的是對(duì)稱算法。

    回過(guò)頭來(lái),還記得文章開頭上述非對(duì)稱加密的作用嗎?就是為了解決對(duì)稱加密傳輸密鑰容易被竊取的缺陷,而https沒有粗暴的用非對(duì)稱加密來(lái)替換對(duì)稱加密,而是組合了這兩種用法,利用非對(duì)稱來(lái)傳輸對(duì)稱加密的密鑰!

    再來(lái)個(gè)中文說(shuō)明的圖,意思差不多,但是更詳盡:

    4.2 數(shù)字證書究竟解決了什么問題

    還記得<3.2 數(shù)字簽名存在問題>章節(jié)的問題嗎,那么數(shù)字證書是怎么解決普通數(shù)字簽名的問題的?

    首先我們回到主題,我們需要解決什么問題?問題就是“如何確保本地持有的公鑰是要訪問的網(wǎng)站的真正公鑰,而不是被壞人替換了假的公鑰呢”

    這里用到的是事先存儲(chǔ)方法,就是事先將這個(gè)網(wǎng)站的公鑰放在一個(gè)地方P,并且信任這個(gè)地方P上的所有公鑰。 將來(lái)只要瀏覽器能識(shí)別出公鑰來(lái)自P,那么也會(huì)認(rèn)可該公鑰。

    于是存在某種機(jī)構(gòu),該機(jī)構(gòu)不直接提供公鑰,而是提供數(shù)字證書,把公鑰放在證書內(nèi),將來(lái)只要瀏覽器識(shí)別數(shù)字證書是ok的,那么公鑰自然也是ok的。

    那么如何識(shí)別數(shù)字證書呢?只要給數(shù)字證書加上防偽碼就行了!這個(gè)防偽碼就是數(shù)字證書上的數(shù)字簽名(證書內(nèi)容計(jì)算摘要,再用CA的私鑰加密,只能CA的公鑰能解密,CA的公鑰內(nèi)置于windows操作系統(tǒng)內(nèi))

    瀏覽器程序有一個(gè)證書選項(xiàng),里面有“受信任的根證書頒發(fā)機(jī)構(gòu)”,還有你的系統(tǒng)里的證書管理工具里也有信任的機(jī)構(gòu),機(jī)構(gòu)列表來(lái)源就是根證書,安裝一個(gè)根證書,機(jī)構(gòu)列表就多個(gè)一條記錄,在你裝上系統(tǒng)或者下載瀏覽器的時(shí)候自帶的,也可以后天安裝。

    一個(gè)根證書對(duì)應(yīng)一家CA機(jī)構(gòu),根證書內(nèi)持有該CA的公鑰,這個(gè)公鑰可以查看防偽碼,公鑰用于驗(yàn)證數(shù)字證書是否是其簽發(fā)的;具體步驟就是再次計(jì)算內(nèi)容的摘要,與證書中的摘要進(jìn)行對(duì)比。

    注意:中間人攻擊的特點(diǎn)是截獲并替換,可以理解是在網(wǎng)絡(luò)的中間替換,并不能替換已經(jīng)下載至本地的正確的公鑰,后者屬于物理替換,比如中病毒了或機(jī)器被遠(yuǎn)程控制了才可以。為什么這么說(shuō),是因?yàn)椤稊?shù)字簽名是什么?》作者阮一峰 (當(dāng)然好多別的網(wǎng)站也有,畢竟都是翻譯國(guó)外的)里面提到:

    復(fù)雜的情況出現(xiàn)了。道格想欺騙蘇珊,他'偷偷使用了蘇珊的電腦,用自己的公鑰換走了鮑勃的公鑰。' 此時(shí),蘇珊實(shí)際擁有的是道格的公鑰,但是還以為這是鮑勃的公鑰。因此,道格就可以冒充鮑勃, 用自己的私鑰做成"數(shù)字簽名",寫信給蘇珊,讓蘇珊用假的鮑勃公鑰進(jìn)行解密

    這里面提到偷走電腦是非常不恰當(dāng)?shù)?#xff0c;也是導(dǎo)致難以理解數(shù)字證書的根本原因!因?yàn)榧热荒芡底唠娔X了,為何不能替換根證書?這樣后續(xù)就可以替換網(wǎng)絡(luò)中的數(shù)字證書,進(jìn)而替換公鑰了!

    由上所知,預(yù)存在電腦上的根證書是不會(huì)被替換了(比如中病毒了或機(jī)器被遠(yuǎn)程控制了才可以),那么訪問網(wǎng)站時(shí),網(wǎng)站提供的數(shù)字證書就是可驗(yàn)證的,進(jìn)而網(wǎng)站的公鑰一定是安全的!這樣就解決了中間人的問題!

    B嘗試訪問網(wǎng)站A,A把自己的申請(qǐng)的數(shù)字證書發(fā)布給B,如果C截獲A與B之間通信,把A的數(shù)字證書換成C偽造的數(shù)字證書發(fā)給B,然后C冒充A與B進(jìn)行通信,這個(gè)時(shí)候B本地的根證書持有CA的公鑰,可以發(fā)現(xiàn)數(shù)字證書是假的!

    4.2.1 如何攻擊數(shù)字證書呢

    這個(gè)問題很有意思,正好也可以加深我們的理解
    摘自《針對(duì)證書的攻擊方法》

    一 在公鑰注冊(cè)之前攻擊 // 除了內(nèi)鬼,誰(shuí)會(huì)知道你注冊(cè)公鑰的時(shí)刻去截獲呢?
    二 注冊(cè)相似人名進(jìn)行攻擊
    三 竊取認(rèn)證機(jī)構(gòu)的私鑰進(jìn)行攻擊 //頂級(jí)黑客才行,畢竟有CA公司被攻破,也引發(fā)倒閉的前車之鑒,但是現(xiàn)存的幾家CA,呵呵,想攻破,難于上青天
    四 攻擊者偽裝成認(rèn)證機(jī)構(gòu)進(jìn)行攻擊 //相對(duì)來(lái)說(shuō)容易實(shí)現(xiàn),只要讓用戶安裝你的假根證書,讓瀏覽器認(rèn)為攻擊者是合法的CA即可

    因此,也提醒大家,在安裝根證書時(shí),需要小心再小心,當(dāng)然即使是程序員,也難以區(qū)分根證書的!


    參考:

    《公鑰與私鑰,HTTPS詳解》
    《SSL證書原理講解》 參考數(shù)字證書交互方式
    《數(shù)字簽名是什么?》作者 阮一峰 參考留言
    Https協(xié)議簡(jiǎn)析及中間人攻擊原理
    《針對(duì)證書的攻擊方法》

    總結(jié)

    以上是生活随笔為你收集整理的对称加密和非对称加密、公钥和私钥、单向认证和双向认证、数字签名、数字证书、根证书的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。