非對(duì)稱加密算法
使用過(guò)程:
乙方生成兩把密鑰(公鑰和私鑰)
甲方獲取乙方的公鑰,然后用它對(duì)信息加密。
乙方得到加密后的信息,用私鑰解密,乙方也可用私鑰加密字符串
甲方獲取乙方私鑰加密數(shù)據(jù),用公鑰解密
優(yōu)點(diǎn):
更安全,密鑰越長(zhǎng),它就越難破解
缺點(diǎn):
加密速度慢
常用算法:
RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)
非對(duì)稱加密方法
1公鑰私鑰的使用原則
①每一個(gè)公鑰都對(duì)應(yīng)一個(gè)私鑰。
?、诿荑€對(duì)中,讓大家都知道的是公鑰,不告訴大家,只有自己知道的,是私鑰。
? ? ? ? ③如果用其中一個(gè)密鑰加密數(shù)據(jù),則只有對(duì)應(yīng)的那個(gè)密鑰才可以解密。
④如果用其中一個(gè)密鑰可以進(jìn)行解密數(shù)據(jù),則該數(shù)據(jù)必然是對(duì)應(yīng)的那個(gè)密鑰進(jìn)行的加密。
非對(duì)稱密鑰密碼的主要應(yīng)用就是公鑰加密和公鑰認(rèn)證。
2公鑰加密、解密
加密的目的,是不希望第三者看到當(dāng)前兩個(gè)通訊用戶的通訊內(nèi)容。
2.1加密
A(客戶)想給B(服務(wù)器)發(fā)送一段文字,但是不想讓別人看到,因此想使用非對(duì)稱加密方法來(lái)加密這段文字,當(dāng)然,B需要有一對(duì)公鑰和私鑰:
?、?B將他的公鑰發(fā)送給A
?、?A用B給他的公鑰加密這段文字,然后傳給B
?、?B用他的私鑰解密A發(fā)過(guò)來(lái)的消息,這里要強(qiáng)調(diào)的是,只要B的私鑰不泄露,這封信就是安全的,即使落在別人手里,也無(wú)法解密。
通過(guò)這幾步,B就能成功收到A發(fā)送的信息,同時(shí)又達(dá)到了保密的目的。
2.2解密
如果B想給A回信息,就簡(jiǎn)單的多了:
?、?B將要回復(fù)的信息通過(guò)自己的私鑰加密,然后傳送給A
② A用B之前給他的公鑰解出這份信息。
3、公鑰認(rèn)證
在公鑰加密、解密里面描述的通訊過(guò)程看似簡(jiǎn)單,但想想這個(gè)問(wèn)題:在過(guò)程2中,A怎么B給他的回信在傳遞過(guò)程中,有沒(méi)有被人修改?這就涉及到數(shù)字簽名的概念。
3.1數(shù)字簽名(digital signature)
微軟官方給出的定義:“數(shù)字簽名”是指可以添加到文件的電子安全標(biāo)記。使用它可以驗(yàn)證文件的發(fā)行者以及幫助驗(yàn)證文件自被數(shù)字簽名后是否發(fā)生更改。
3.1.1數(shù)字簽名原理
要達(dá)到這個(gè)目的,一般是對(duì)信息做一個(gè)hash計(jì)算得到一個(gè)hash值,注意,這個(gè)過(guò)程是不可逆的,也就是說(shuō)無(wú)法通過(guò)hash值得出原來(lái)的信息內(nèi)容。在把信息發(fā)送出去時(shí),把這個(gè)hash值加密后做為一個(gè)簽名和信息一起發(fā)出去。 接收方在收到信息后,會(huì)重新計(jì)算信息的hash值,并和信息所附帶的hash值(解密后)進(jìn)行對(duì)比,如果一致,就說(shuō)明信息的內(nèi)容沒(méi)有被修改過(guò),因?yàn)檫@里hash計(jì)算可以保證不同的內(nèi)容一定會(huì)得到不同的hash值,所以只要內(nèi)容一被修改,根據(jù)信息內(nèi)容計(jì)算的hash值就會(huì)變化。當(dāng)然,不懷好意的人也可以修改信息內(nèi)容的同時(shí)也修改hash值,從而讓它們可以相匹配,為了防止這種情況,hash值一般都會(huì)加密后(也就是簽名)再和信息一起發(fā)送。
3.1.2數(shù)字簽名使用方式
下面通過(guò)例子來(lái)說(shuō)明這個(gè)過(guò)程:
B給A回信時(shí),采用了數(shù)字簽名的方式
1、B先用hash函數(shù),生成信件的摘要(digest)
2、B使用自己的私鑰,對(duì)這個(gè)摘要加密,這樣就生成了數(shù)字簽名(signature)
3、B將這個(gè)簽名附在要回復(fù)的信息后面,一起發(fā)給A
4、A收到B的信息后,取下數(shù)字簽名,并通過(guò)B的公鑰解密,得到信件的摘要信息
5、A在對(duì)B發(fā)送的信息本身使用B指定的hash函數(shù),將得到的結(jié)果同上一步解密得到的摘要進(jìn)行對(duì)比,如果兩者一致,就說(shuō)明B發(fā)過(guò)來(lái)的信息未被修改過(guò)。
3.2數(shù)字證書(shū)(Digital Certificate)
問(wèn)題就這樣結(jié)束了嗎?遠(yuǎn)沒(méi)有,試想,雖然A確定了B回給他的信息是未修改過(guò)的,但是怎么確定給他回信息的就是B?如果有不懷好意的C把A保存的B的公鑰偷偷換成自己的,并冒用B的名義給A發(fā)信息呢?
要解決這個(gè)問(wèn)題,A只要能確定自己持有的公鑰到底是不是B的就行了,這就需要用到數(shù)字證書(shū)。
數(shù)字證書(shū)是用來(lái)驗(yàn)證公鑰所屬的用戶身份。在日常生活中,如果我們要驗(yàn)證一個(gè)人的身份,通常的做法是查看他的身份證。我們信任身份證頒發(fā)機(jī)構(gòu)即政府機(jī)構(gòu)的公信力,因此只要驗(yàn)證一個(gè)人的身份證不是偽造的,我們就相信這個(gè)人的身份和身份證上所描述的是一致的。
數(shù)字證書(shū)就是一個(gè)人或者組織在網(wǎng)絡(luò)世界中的身份證,其發(fā)證機(jī)關(guān)是證書(shū)管理機(jī)構(gòu)(certificate authority,CA)。CA用自己的私鑰對(duì)用戶的身份信息(主要是用戶名和該用戶的公鑰)進(jìn)行簽名,該簽名和用戶的身份信息一起就形成了證書(shū)。
3.2.1數(shù)字證書(shū)的構(gòu)成
證書(shū)的發(fā)布機(jī)構(gòu)(Issuer)
指出是什么機(jī)構(gòu)發(fā)布的這個(gè)證書(shū),也就是指明這個(gè)證書(shū)是哪個(gè)證書(shū)中心(certificate authority,簡(jiǎn)稱CA)發(fā)布的的(只是創(chuàng)建證書(shū),不是指證書(shū)的使用者)。
證書(shū)的有效期(Valid from , Valid to)
也就是證書(shū)的有效時(shí)間,或者說(shuō)證書(shū)的使用期限。 過(guò)了有效期限,證書(shū)就會(huì)作廢,不能使用了。
公鑰 (Public key)
這個(gè)我們?cè)谇懊娼榻B公鑰密碼體制時(shí)介紹過(guò),公鑰是用來(lái)對(duì)消息進(jìn)行加密解密的,是很長(zhǎng)的一串?dāng)?shù)字。
證書(shū)所有者(Subject)
這個(gè)證書(shū)是發(fā)布給誰(shuí)的,或者說(shuō)證書(shū)的所有者,一般是某個(gè)人或者某個(gè)公司名稱、機(jī)構(gòu)的名稱、公司網(wǎng)站的網(wǎng)址等。
簽名所使用的算法 (Signature algorithm)
指的這個(gè)數(shù)字證書(shū)的數(shù)字簽名所使用的加密算法,這樣就可以使用證書(shū)發(fā)布機(jī)構(gòu)的證書(shū)里面的公鑰,根據(jù)這個(gè)算法對(duì)指紋進(jìn)行解密。指紋的加密結(jié)果就是數(shù)字簽名
指紋以及指紋算法 (Thumbprint, Thumbprint algorithm)
這個(gè)是用來(lái)保證證書(shū)的完整性的,也就是說(shuō)確保證書(shū)沒(méi)有被修改過(guò)。 其原理就是在發(fā)布證書(shū)時(shí),發(fā)布者根據(jù)指紋算法(一個(gè)hash算法)計(jì)算整個(gè)證書(shū)的hash值(指紋)并和證書(shū)放在一起,使用者在打開(kāi)證書(shū)時(shí),自己也根據(jù)指紋算法計(jì)算一下證書(shū)的hash值(指紋),如果和剛開(kāi)始的值對(duì)得上,就說(shuō)明證書(shū)沒(méi)有被修改過(guò),因?yàn)樽C書(shū)的內(nèi)容被修改后,根據(jù)證書(shū)的內(nèi)容計(jì)算的出的hash值(指紋)是會(huì)變化的。
3.2.2數(shù)字證書(shū)的生成過(guò)程
1、使用數(shù)字證書(shū)申請(qǐng)者的身份信息生成數(shù)字簽名
2、將證書(shū)申請(qǐng)者的身份信息和數(shù)字簽名一起組成數(shù)字證書(shū)
3.2.3數(shù)字證書(shū)原理
有了數(shù)字證書(shū)以后,A和想跟B通信,就可以通過(guò)B的數(shù)字證書(shū)來(lái)獲取B的公鑰,以達(dá)到驗(yàn)證自己手中的公鑰到底是不是B的目的。過(guò)程是這樣的:
1、B給A回信的時(shí)候,在信息后面附上了自己的數(shù)字證書(shū)
2、A收到B的回信以后,會(huì)取出附帶的數(shù)字證書(shū),并讀取證書(shū)中的發(fā)布機(jī)構(gòu)(Issuer),然后從操作系統(tǒng)的受信任證書(shū)機(jī)構(gòu)列表中查找該證書(shū)辦發(fā)機(jī)構(gòu)的公鑰,如果找不到,說(shuō)明這個(gè)證書(shū)頒發(fā)機(jī)構(gòu)是個(gè)不受信任的,B發(fā)過(guò)來(lái)的信息當(dāng)然也是不安全的
3、使用上一步取到的證書(shū)頒發(fā)機(jī)構(gòu)的公鑰,解出數(shù)字證書(shū),得到可能是B的用戶信息和數(shù)字簽名
4、A通過(guò)證書(shū)中指定的加密算法對(duì)可能是B的用戶信息進(jìn)行hash加密
5、加密后的結(jié)果和證書(shū)中解出的數(shù)字簽名進(jìn)行對(duì)比,如果相同,就說(shuō)明這份用戶信息確實(shí)是B的,也就是說(shuō)用戶信息中包含的公鑰確實(shí)是B的
這樣就驗(yàn)證了B身份的真實(shí)性。
下圖很形象的表示了這個(gè)過(guò)程:
3.2.4證書(shū)發(fā)布中心(CA)的公鑰的嵌套驗(yàn)證
這里有一個(gè)有趣的問(wèn)題,用戶A使用證書(shū)機(jī)構(gòu)的公鑰來(lái)驗(yàn)證用戶B的數(shù)字證書(shū),但如果A和B使用的證書(shū)認(rèn)證中心(CA)不同怎么辦呢?由于證書(shū)認(rèn)證中心可以通過(guò)另外一個(gè)更高級(jí)別的認(rèn)證中心對(duì)該證書(shū)機(jī)構(gòu)的公鑰頒發(fā)一個(gè)證書(shū),這樣形成了一個(gè)公鑰證書(shū)的嵌套循環(huán),該循環(huán)的終點(diǎn)就是根證書(shū)機(jī)構(gòu)。根證書(shū)機(jī)構(gòu)較少,其公鑰可以通過(guò)安全的方式發(fā)布,如通過(guò)USB拷貝、書(shū)面文件當(dāng)面移交。如此依賴,A就必須從B的CA的樹(shù)形結(jié)構(gòu)底部開(kāi)始,從底層CA往上層CA查詢,一直到找到共同的信任CA為止。
整個(gè)過(guò)程如下圖所示:
3.2.5證書(shū)發(fā)布機(jī)構(gòu)
3.2.5.1誰(shuí)可以成為證書(shū)發(fā)布機(jī)構(gòu)
到這里,你可能會(huì)想,那我們自己就不能發(fā)布證書(shū)嗎?就一定要花錢(qián)去申請(qǐng)?
當(dāng)然不是,我們自己也可以成立證書(shū)發(fā)布機(jī)構(gòu),但是需要通過(guò)一些安全認(rèn)證等等,只是有點(diǎn)麻煩。另外,如果數(shù)字證書(shū)只是要在公司內(nèi)部使用,公司可以自己給自己生成一個(gè)證書(shū),在公司的所有機(jī)器上把這個(gè)證書(shū)設(shè)置為操作系統(tǒng)信任的證書(shū)發(fā)布機(jī)構(gòu)的證書(shū)(這句話仔細(xì)看清楚,有點(diǎn)繞口),這樣以后公司發(fā)布的證書(shū)在公司內(nèi)部的所有機(jī)器上就可以通過(guò)驗(yàn)證了(在發(fā)布證書(shū)時(shí),把這些證書(shū)的Issuer(發(fā)布機(jī)構(gòu))設(shè)置為我們自己的證書(shū)發(fā)布機(jī)構(gòu)的證書(shū)的Subject(主題)就可以了)。但是這只限于內(nèi)部應(yīng)用,因?yàn)橹挥形覀児咀约旱臋C(jī)器上設(shè)置了信任我們自己這個(gè)所謂的證書(shū)發(fā)布機(jī)構(gòu),而其它機(jī)器上并沒(méi)有事先信任我們這個(gè)證書(shū)發(fā)布機(jī)構(gòu),所以在其它機(jī)器上,我們發(fā)布的證書(shū)就無(wú)法通過(guò)安全驗(yàn)證。
我們自己可以去注冊(cè)一家公司來(lái)專門(mén)給別人發(fā)布證書(shū),但是很明顯,我們自己的專門(mén)發(fā)布證書(shū)的公司是不會(huì)被那些國(guó)際上的權(quán)威機(jī)構(gòu)認(rèn)可的,人家怎么知道你是不是個(gè)狗屁皮包公司?因此微軟(或其它操作系統(tǒng)提供商)在它的操作系統(tǒng)中,并不會(huì)信任我們這個(gè)證書(shū)發(fā)布機(jī)構(gòu),當(dāng)應(yīng)用程序在檢查證書(shū)的合法信的時(shí)候,一看證書(shū)的發(fā)布機(jī)構(gòu)并不是操作系統(tǒng)所信任的發(fā)布機(jī)構(gòu),就會(huì)拋出錯(cuò)誤信息。也就是說(shuō)windows操作系統(tǒng)中不會(huì)預(yù)先安裝好我們這個(gè)證書(shū)發(fā)布機(jī)構(gòu)的證書(shū),不信任我們這個(gè)發(fā)布機(jī)構(gòu)。
3.2.5.2不受信任的證書(shū)發(fā)布機(jī)構(gòu)的危害
為什么一個(gè)證書(shū)發(fā)布機(jī)構(gòu)受不受信任這么重要?我們舉個(gè)例子。假設(shè)我們開(kāi)了一個(gè)狗屁公司來(lái)為別人發(fā)布證書(shū),并且我和微軟有一腿,微軟在他們的操作系統(tǒng)中把我設(shè)置為了受信任的證書(shū)發(fā)布機(jī)構(gòu)。現(xiàn)在如果有個(gè)小公司叫hisunsray花了10塊錢(qián)讓我為他們公司申請(qǐng)了一個(gè)證書(shū),并且公司慢慢壯大,證書(shū)的應(yīng)用范圍也越來(lái)越廣。然后有個(gè)奸商的公司baidu想冒充hisunsray,于是給了我¥10000,讓我為他們頒布一個(gè)證書(shū),但是證書(shū)的名字(Subject)要寫(xiě)hisunsray,假如我為了這¥10000,真的把證書(shū)給了他們,那么他們以后就可以使用這個(gè)證書(shū)來(lái)冒充hisunsray了。
如果是一個(gè)優(yōu)秀的證書(shū)發(fā)布機(jī)構(gòu),比如你要向他申請(qǐng)一個(gè)名字叫hisunsray的證書(shū),它會(huì)讓你提供很多資料證明你確實(shí)可以代表hisunsray這個(gè)公司,也就是說(shuō)他回去核實(shí)你的身份。證書(shū)發(fā)布機(jī)構(gòu)是要為他發(fā)布出的證書(shū)負(fù)法律責(zé)任的。
3.2.6如何查看數(shù)字證書(shū)
我們的操作系統(tǒng)中會(huì)預(yù)先安裝好一些證書(shū)發(fā)布機(jī)構(gòu)的證書(shū),我們可以通過(guò)證書(shū)管理器進(jìn)行證書(shū)的增、刪操作,下面介紹如何找到它們。
3.2.6.1windows
開(kāi)始菜單-》運(yùn)行,輸入certmgr.msc,回車

3.2.6.2mac
打開(kāi)keychain,選擇鑰匙串中的系統(tǒng)根證書(shū),種類中的證書(shū)即可看到下圖所示的收信人證書(shū)發(fā)布機(jī)構(gòu)列表:
電子發(fā)燒友App






















評(píng)論