1. 程式人生 > 其它 >https ssl(tls)為什麼不直接用公鑰加密資料?

https ssl(tls)為什麼不直接用公鑰加密資料?

很多人都提到了非對稱加密速度慢,但這只是一個原因,但不是主要原因,甚至是微不足道的原因。

SSL協議到3.0後就已經到頭了,取而代之的是TLS,相較於SSL的“安全套接字層”的命名,TLS的“傳輸層安全”這種定義更加嚴謹。畢竟傳輸安全的範疇要遠大於套接字安全這種定義,這種定義偏技術層面,但安全不僅要解決技術層面的問題,也要解決人的問題以及由此帶來的信任問題。因為加密只是安全的一部分,解決傳輸兩端的信任,以及讓整個演算法擺脫人的因素,才是安全的核心。

詐騙電話之所以能讓很多人上當,實際上是一種信任欺詐,即使你和騙子間的通訊採用了量子加密,安全到連FBI、CIA、克格勃、摩薩德、朝陽大媽都無法破解的地步,這也只能確保你被騙的更加安全、更加保密而已。

騰訊即使能把你和潛在“炮友”的聊天加密到連你老婆都無法破解的地步,但還是無法確保你的聊天物件到底是男的還是女的,是個美女還是醜B,即使是無所不能的“剽竊慣犯”小馬哥也做不到,做不到就是做不到,大馬哥也做不到。

以下兩個問題:

1、如何確保私鑰的安全,如果一個公司的後臺人員離職並把私鑰帶走,該怎麼辦?

私鑰無論是配置到Tomcat還是Ngnix都需要後臺人員的參與,甚至整個後臺開發人員都知道私鑰檔案在哪,把私鑰檔案帶走是so easy的事,即便這個私鑰採用了p12格式進行了加密,但這個密碼還是由後臺開發人員掌握。當然,如果這個公司的所有事情都是老闆親自親為,那就是另外一回事。

顯然任何公司都不可能因為一個後臺人員的離職,並由此產生潛在的私鑰洩密風險而去重新申請SSL證書。一是解決不了根本問題; 二是費用的問題,三是總不能頻繁釋出公鑰讓吃瓜群眾不停的更新。

回到題主的問題,如果客戶端(客戶端只有公鑰)用公鑰加密,私鑰解密的話,顯然受人為的因素,風險太大了。即便這個公司的老闆很開明(也可是很糊塗),相信所有人都是可靠的,採用了公鑰加密私鑰解密,但也只是解決了單向傳輸的問題。

如果伺服器向客戶端傳送資料,則需要私鑰加密,公鑰解密。那麼真能用私鑰加密麼?

2、無論是openssl還是微軟的CryptoAPI,都沒有提供私鑰的加密功能,而只是將私鑰的加密功能限定在簽名上,為什麼不提供私鑰加密API呢?
顯然不是因為openssl做不到,也不是因為微軟做不到。讓私鑰不提供加密介面是出於安全的目的,也就是要保護私鑰。如果私鑰頻繁用於資料加密,公鑰在解密的過程中很有可能會破解私鑰,從而導致私鑰洩漏。如果把私鑰加密只是應用到簽名上,也就是身份認證,則會大大降低由於私鑰加密頻繁導致的洩密風險,畢竟簽名一次就夠了。

當然openssl是開源的,你可以改造一下提供私鑰加密的介面。

在SSL(TLS)中,RSA只是用於身份認證,即解決信任問題,確保你訪問的網站是淘寶,而不是高仿的“陶寶”,讓你在淘寶上買的是康師傅,而不是康帥傅而已。

最後總結一下,稍微說下openssl。
實際上openssl是對傳輸安全策略的設計,是一種思想,這種思想就是讓安全策略儘可能的擺脫對人的信任依賴,在openssl中加密只是安全策略的一部分。基於這種思想來保障安全的資料傳輸,顯然單靠RSA無法解決這個問題,openssl中採用的是組合方式,也就是加密套件,比如如下套件:TLS_RSA_WITH_AES_128_CBC_SHA。

TLS:表示協議;

RSA:表示資料加密祕鑰的加密演算法(比較拗口)和身份認證的演算法;

AES_128_CBC:表示對稱加密演算法,這個是資料加密的真正演算法;

SHA:表示mac校驗的演算法,也用於PRF產生的演算法;

因此,資料加密的祕鑰保護是核心,資料祕鑰的產生要隨機,要能即興發揮的臨時產生。
比如通過隨機數產生PreMasterKey,演算法可以複雜點,通訊雙方各自貢獻PreMasterKey的引數,最後客戶端對PreMasterKey進行RSA加密後傳輸給伺服器,伺服器解密後,根據規則產生真正的加密Master Key,這個MasterKey就是對稱加密的祕鑰。

即便如此,由於RSA參與了資料祕鑰的加密過程,因此也會導致因私鑰洩漏產生的不安全(正如上面所說,私鑰檔案要依賴人的安全),也就是說最好連非對稱加密的祕鑰對也能臨時產生並用戶動態交換,ECDHE就產生了。比如套件:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

這裡的RSA僅僅是作為身份認證(即證明網站是可信的,確實是淘寶網站),RSA將不再對PreMaterKey進行加密,該值的產生有ECDHE演算法負責,這樣進一步減少了對人的依賴。因為一旦網站的資料被抓包留存,理論上就存在PreMasterKey被解密的可能,從而導致MasterKey的洩漏,以至於整個通訊資料都不安全。

說的太多了,超出問題的範疇,就此打住。。。。。

附:我自己封裝過TLS客戶端通訊,並用於自己的郵箱程式,見下文。

一隻會鏟史的貓:我的箱客戶端程式Popmail,以及巴拉巴拉。。。

這是我封裝的SSLite.dll,裡面有如何使用該庫進行HTTP網頁的下載原始碼:

基於SSL(TLS)的HTTPS網頁下載