不少人都提到了非對稱加密速度慢,但這只是一個緣由,但不是主要緣由,甚至是微不足道的緣由。html
SSL協議到3.0後就已經到頭了,取而代之的是TLS,相較於SSL的「安全套接字層」的命名,TLS的「傳輸層安全」這種定義更加嚴謹。畢竟傳輸安全的範疇要遠大於套接字安全這種定義,這種定義偏技術層面,但安全不只要解決技術層面的問題,也要解決人的問題以及由此帶來的信任問題。由於加密只是安全的一部分,解決傳輸兩端的信任,以及讓整個算法擺脫人的因素,纔是安全的核心。算法
詐騙電話之因此能讓不少人上當,其實是一種信任欺詐,即便你和騙子間的通訊採用了量子加密,安全到連FBI、CIA、克格勃、摩薩德、朝陽大媽都沒法破解的地步,這也只能確保你被騙的更加安全、更加保密而已。安全
騰訊即便能把你和潛在「炮友」的聊天加密到連你老婆都沒法破解的地步,但仍是沒法確保你的聊天對象究竟是男的仍是女的,是個美女仍是醜B,即便是無所不能的「剽竊慣犯」小馬哥也作不到,作不到就是作不到,大馬哥也作不到。服務器
如下兩個問題:網站
一、如何確保私鑰的安全,若是一個公司的後臺人員離職並把私鑰帶走,該怎麼辦?加密
私鑰不管是配置到Tomcat仍是Ngnix都須要後臺人員的參與,甚至整個後臺開發人員都知道私鑰文件在哪,把私鑰文件帶走是so easy的事,即使這個私鑰採用了p12格式進行了加密,但這個密碼仍是由後臺開發人員掌握。固然,若是這個公司的全部事情都是老闆親自親爲,那就是另一回事。設計
顯然任何公司都不可能由於一個後臺人員的離職,並由此產生潛在的私鑰泄密風險而去從新申請SSL證書。一是解決不了根本問題; 二是費用的問題,三是總不能頻繁發佈公鑰讓吃瓜羣衆不停的更新。htm
回到題主的問題,若是客戶端(客戶端只有公鑰)用公鑰加密,私鑰解密的話,顯然受人爲的因素,風險太大了。即使這個公司的老闆很開明(也但是很糊塗),相信全部人都是可靠的,採用了公鑰加密私鑰解密,但也只是解決了單向傳輸的問題。對象
若是服務器向客戶端發送數據,則須要私鑰加密,公鑰解密。那麼真能用私鑰加密麼?blog
二、不管是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網頁的下載源碼: