悄悄話, 有關(guān)'非對(duì)稱加密'

簡(jiǎn)單的上網(wǎng), 就是客戶端和服務(wù)器通訊, 怎么保證安全, 就是解決以下問題:
客戶端到服務(wù)器的數(shù)據(jù), 只有服務(wù)器知道其內(nèi)容
客戶端收到的數(shù)據(jù), 能夠驗(yàn)證其真實(shí)來源
先來關(guān)注問題1:
服務(wù)器創(chuàng)建兩把鑰匙, 這兩把鑰匙有如下特點(diǎn):
鑰匙既可以用來加密東西, 又可以用來解密東西
一把鑰匙加密的東西只能用另一把鑰匙來解密
所以對(duì)于問題1, 解決方法來了.
服務(wù)器先把一把鑰匙(稱之為'公鑰')扔給客戶端, 客戶端收到后, 用公鑰加密數(shù)據(jù), 再發(fā)給服務(wù)器.
顯然, 他人拿了公鑰也沒意義, 拿了被公鑰加密的數(shù)據(jù)也沒意義.
只有服務(wù)器有另一把鑰匙(稱之為'私鑰')來解鎖, 以知道傳了什么, 問題1解決.
再來關(guān)注問題2:
服務(wù)器計(jì)算要發(fā)送的數(shù)據(jù)的MD5的值(稱為摘要, 'digest'), 當(dāng)然也可以使用別的哈希函數(shù). 哈希函數(shù)的特性保證了數(shù)據(jù)和摘要的一一對(duì)應(yīng), 幾乎不存在重復(fù).
接著用私鑰加密摘要(digest), 生成的一小段值稱為數(shù)字簽名(signature).
數(shù)字簽名對(duì)應(yīng)著真實(shí)的服務(wù)器, 就像某個(gè)人簽名代表其本人一樣, 但數(shù)字簽名不能偽造.
然后將數(shù)據(jù)(未加密)和數(shù)字簽名一起發(fā)給客戶端, 顯然任何人都可以用公鑰解密摘要.
客戶端將數(shù)字簽名用公鑰解密, 并計(jì)算數(shù)據(jù)的MD5值,
客戶端對(duì)比數(shù)字簽名解密出的值和數(shù)據(jù)的MD5值, 二者相等, 即驗(yàn)證了其來源的真實(shí)性.
且慢,
原本是客戶端A要與服務(wù)器A通訊,
要是有邪惡的X搶先表示(假冒)自己是服務(wù)器A并建立了通訊, 或者把客戶端A的公鑰A(服務(wù)器A的)換成自己的公鑰B, 那客戶端A實(shí)質(zhì)就是在和邪惡的X通訊, 客戶端A的消息就泄露了.
說白了, 還要驗(yàn)證公鑰來源的真實(shí)性.
找到一個(gè)可信任的第三方, 即數(shù)字證書認(rèn)證機(jī)構(gòu)(CA, Certificate Authority), 將公鑰和其相關(guān)信息(比如改公鑰是屬于誰的)用CA的私鑰加密, 生成數(shù)字證書(Digital Certificate).
服務(wù)器發(fā)送時(shí), 將數(shù)據(jù), 數(shù)字簽名, 數(shù)字證書一起發(fā)送給客戶端,
客戶端用數(shù)字證書的簽發(fā)者CA的公鑰解密該證書, 獲得可信的公鑰.
至此, 整個(gè)過程就安全了.
除非CA的私鑰暴露, 或者哈希函數(shù)被快速破解,
至于前者, 只能希望其盡量安全, 就像銀行一樣,而后者則是等真正實(shí)用的量子計(jì)算機(jī)出來以后的事了.
而HTTPS里的SSL層干的就是這些事.