對(duì)于數(shù)字證書、數(shù)字簽名的概念一直很模糊,雖然網(wǎng)上看了很多文章,但是自己腦子里想完整地梳理一遍的時(shí)候就還是亂亂的,所以動(dòng)手整理了下,在寫作的過程中各個(gè)概念之間的關(guān)系慢慢變得清晰了。
公鑰、私鑰和數(shù)字簽名
首先是公鑰和私鑰的概念。公鑰(Public Key)和私鑰(Private Key)是一對(duì)使用特定加密算法產(chǎn)生的密鑰對(duì)(兩串字符串),可以使用?OpenSSL?或者 OpenSSH 的 ssh-keygen 工具生成。公鑰和私鑰都可以用來加密數(shù)據(jù),經(jīng)過私鑰加密的數(shù)據(jù),只有通過公鑰才可以解密出來,反之亦然。
私鑰自己保留,公鑰用于發(fā)放給別人。為什么要發(fā)給別人呢?因?yàn)檫@樣就可以實(shí)現(xiàn)和對(duì)方之間的加密通訊,過程如下:
- Susan 有 Bob 的公鑰,在給 Bob 發(fā)消息前使用公鑰對(duì)消息進(jìn)行加密,這樣就只有擁有私鑰的 Bob 才可以解密消息。
- Bob 使用他的私鑰可以在數(shù)據(jù)上進(jìn)行數(shù)字簽名,即先將要發(fā)送的數(shù)據(jù)進(jìn)行 Hash 運(yùn)算,然后使用私鑰加密 Hash 運(yùn)行的結(jié)果,最后加密的結(jié)果就是叫數(shù)字簽名(Digital Signature)。
- Bob 把數(shù)字簽名隨同數(shù)據(jù)一起發(fā)給 Susan,Susan 通過 Bob 的公鑰可以獲得兩個(gè)信息:
1 - 如果使用公鑰成功解密數(shù)字簽名,則說明這個(gè)信息確實(shí)是通過 Bob 的私鑰加密的
2 - 對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行 Hash 運(yùn)算,如果結(jié)果與解密出來的 Hash 值一致,則說明數(shù)據(jù)沒有被篡改過。
> Hash 算法會(huì)將數(shù)據(jù)變成一段固定長(zhǎng)度的 message digest,且不同的原始數(shù)據(jù)經(jīng)過運(yùn)算后會(huì)產(chǎn)生截然不同的結(jié)果,可以認(rèn)為不存在使用不同的原始數(shù)據(jù)來偽造相同的 hash 值的情況。
如果按照以上的流程,Bob 向 Susan 發(fā)送的數(shù)據(jù)是沒有加密的(即使用私鑰加密了數(shù)據(jù),別人也能用公鑰解開),那如何保證數(shù)據(jù)不被竊取呢?具體的例子可以看 HTTPS 一節(jié)的介紹。
中間人攻擊與數(shù)字證書
上文中的加密通訊是在 Susan 正確獲得 Bob 公鑰的前提下進(jìn)行的,如果 Susan 和 Bob 的通訊被 Doug 攔截,Doug 將 Bob 發(fā)給 Susan 的公鑰替換成自己的公鑰(至于替換的方式我們先不管),這樣 Susan 就會(huì)認(rèn)為 Doug 是 Bob,把原本要發(fā)給 Bob 的消息使用 Doug 的公鑰加密并發(fā)送,Doug 收到后可以用自己的私鑰解密,獲得數(shù)據(jù)內(nèi)容,然后再用 Bob 的公鑰加密發(fā)送給 Bob,Bob 會(huì)認(rèn)為這些信息是 Susan 發(fā)過來的。在這個(gè)過程中 Doug 可以任意篡改信息,Doug 就是在進(jìn)行中間人攻擊。
數(shù)字證書(Digital Certificate)就是用來確保 Susan 拿到的確實(shí)是 Bob 的公鑰,而不是中間人 Doug 的。數(shù)字證書是由 Certificate Authority(CA)機(jī)構(gòu)頒發(fā)的,所謂數(shù)字證書就是 CA 機(jī)構(gòu)使用自己的私鑰,對(duì) Bob 的公鑰和一些相關(guān)信息(如國(guó)家、公司、域名)一起加密的結(jié)果,CA 機(jī)構(gòu)在頒發(fā)證書前會(huì)有一套嚴(yán)格的流程來確保相關(guān)信息的準(zhǔn)確性。以網(wǎng)站來舉例,Github 證書經(jīng)過 CA 公鑰解密后獲得的一定就是 Github 的公鑰。知名 CA 機(jī)構(gòu)的根證書會(huì)內(nèi)置于游覽器中,用來確保 CA 機(jī)構(gòu)本身的身份,其中就包含了 CA 機(jī)構(gòu)自身的公鑰。有了證書以后,網(wǎng)站發(fā)送信息只要附帶上自己的證書,就能證明自己的身份。下圖是使用 Chrome 查看 Github 的證書:
HTTPS
那么 HTTPS 與數(shù)字證書之間是什么關(guān)系呢?網(wǎng)上找了一張介紹 HTTPS 的流程圖,如果前面的概念都理解了的話,那一看這個(gè)流程圖就能大概了解 HTTPS 是怎么回事了。
圖中的第四步中 `validata crt` 我理解就是使用 CA 的公鑰驗(yàn)證服務(wù)器端發(fā)送的證書的有效性,如頒發(fā)機(jī)構(gòu)是否有效、證書中的域名和訪問的域名是否一致、證書是否過期、是否被吊銷等。如果證書有問題,游覽器會(huì)給出警告。如果證書有效,客戶端會(huì)產(chǎn)生一個(gè)隨機(jī)字符,并使用從證書中獲得的服務(wù)器端公鑰加密后傳輸給服務(wù)器,這個(gè)信息只有服務(wù)器端的私鑰才能解密,服務(wù)器端解密獲得了隨機(jī)字符后,便使用該隨機(jī)字符對(duì)發(fā)送出去的內(nèi)容進(jìn)行對(duì)稱加密,服務(wù)器端就可以使用相同的隨機(jī)字符進(jìn)行解密,這樣就實(shí)現(xiàn)了加密通訊。
從上面的過程看,HTTPS 通訊是有一定性能損耗的,但畢竟更安全了嘛。
參考鏈接:
www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
http://www.youdzone.com/signature.html
https://jamielinux.com/docs/openssl-certificate-authority/index.html
https://zh.wikipedia.org/wiki/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB
https://zh.wikipedia.org/wiki/%E5%85%AC%E5%BC%80%E5%AF%86%E9%92%A5%E5%8A%A0%E5%AF%86