目前經常使用的加密算法主要分紅三類:git
對稱加密算法算法
非對稱加密算法瀏覽器
消息摘要算法安全
在互聯網中,信息防禦主要涉及兩個方面:信息竊取和信息篡改。對稱/非對稱加密算法可以避免信息竊取,而消息摘要算法可以避免信息篡改。服務器
發送方和接收方須要持有同一把密鑰,發送消息和接收消息均使用該密鑰。性能
相對於非對稱加密,對稱加密具備更高的加解密速度,但雙方都須要事先知道密鑰,密鑰在傳輸過程當中可能會被竊取,所以安全性沒有非對稱加密高。加密
接收方在發送消息前須要事先生成公鑰和私鑰,而後將公鑰發送給發送方。發送放收到公鑰後,將待發送數據用公鑰加密,發送給接收方。接收到收到數據後,用私鑰解密。spa
在這個過程當中,公鑰負責加密,私鑰負責解密,數據在傳輸過程當中即便被截獲,攻擊者因爲沒有私鑰,所以也沒法破解。server
非對稱加密算法的加解密速度低於對稱加密算法,可是安全性更高。ssl
消息摘要算法能夠驗證信息是否被篡改。
在數據發送前,首先使用消息摘要算法生成該數據的簽名,而後簽名和數據一同發送給接收者。接收者收到數據後,對收到的數據採用消息摘要算法得到簽名,最後比較簽名是否一致,以此來判斷數據在傳輸過程當中是否發生修改。
不管輸入的消息有多長,計算出來的消息摘要的長度老是固定的。例如應用MD5算法摘要的消息有128個比特位,用SHA-1算法摘要的消息最終有160比特位的輸出,SHA-1的變體能夠產生192比特位和256比特位的消息摘要。通常認爲,摘要的最終輸出越長,該摘要算法就越安全。變長輸入,定長輸出。
只要輸入的消息不一樣,對其進行摘要之後產生的摘要消息也必不相同;但相同的輸入必會產生相同的輸出。這正是好的消息摘要算法所具備的性質:輸入改變了,輸出也就改變了;兩條類似的消息的摘要確不相近,甚至會截然不同。從理論上來講,無論使用什麼樣的摘要算法,必然存在2個不一樣的消息,對應一樣的摘要。由於輸入是一個無窮集合,而輸出是一個有限集合,因此從數學上來講,必然存在多對一的關係。可是實際上,很難或者說根本不可能人爲的造出具備一樣摘要的2個不一樣消息。因此咱們選擇摘要算法的時候,要注意其安全性。好比如今MD5就是不安全的,已經被國內王小云破解。
消息摘要是單向、不可逆的。只能進行正向的信息摘要,而沒法從摘要中恢復出任何的原始消息,甚至根本就找不到任何與原信息相關的信息。固然,能夠採用強力攻擊的方法,即嘗試每個可能的信息,計算其摘要,看看是否與已有的摘要相同,若是這樣作,最終確定會恢復出摘要的消息。但實際上,要獲得的信息多是無窮個消息之一,因此這種強力攻擊幾乎是無效的。
消息摘要算法來源於CRC算法,最初CRC算法是用來驗證數據完整性的,即咱們常見的奇偶校驗碼、循環冗餘校驗,在CRC基礎上發展處了MD和SHA量大算法家族,CRC比這些算法都要早,MD算法比SHA算法早,SHA算法是對MD算法的改進。再後來則發展出了能夠帶有密碼的消息摘要算法-MAC算法。
消息摘要算法包括三大類,MD、SHA和MAC算法,MD的分類是按照版本規定的,SHA則是按照適用的消息長度分類的:
MD算法: Message Digest Algorithm ,目前主流的是MD5算法,爲第五版算法,以前有MD二、MD三、MD4算法。
SHA算法:安全哈希算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裏面定義的數字簽名算法(Digital Signature Algorithm DSA)。
MAC算法:帶有密碼信息的信息摘要算法,是對MD和SHA算法的演變和改進,包括HmacMD二、HmacMD四、HmacMD五、HmacSHA-256等。
HTTPS實際上是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。服務端和客戶端的信息傳輸都會經過TLS進行加密,因此傳輸的數據都是加密後的數據。具體是如何進行加密,解密,驗證的,且看下圖。
客戶端發起HTTPS請求
這個沒什麼好說的,就是用戶在瀏覽器裏輸入一個https網址,而後鏈接到server的443端口。
服務端的配置
採用HTTPS協議的服務器必需要有一套數字證書,能夠本身製做,也能夠向組織申請。區別就是本身頒發的證書須要客戶端驗證經過,才能夠繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。這套證書其實就是一對公鑰和私鑰。若是對公鑰和私鑰不太理解,能夠想象成一把鑰匙和一個鎖頭,只是全世界只有你一我的有這把鑰匙,你能夠把鎖頭給別人,別人能夠用這個鎖把重要的東西鎖起來,而後發給你,由於只有你一我的有這把鑰匙,因此只有你才能看到被這把鎖鎖起來的東西。
傳送證書
這個證書其實就是公鑰,只是包含了不少信息,如證書的頒發機構,過時時間等等。
客戶端解析證書
這部分工做是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,好比頒發機構,過時時間等等,若是發現異常,則會彈出一個警告框,提示證書存在問題。若是證書沒有問題,那麼就生成一個隨即值。而後用證書對該隨機值進行加密。就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,否則看不到被鎖住的內容。
傳送加密信息
這部分傳送的是用證書加密後的隨機值,目的就是讓服務端獲得這個隨機值,之後客戶端和服務端的通訊就能夠經過這個隨機值來進行加密解密了。
服務段解密信息
服務端用私鑰解密後,獲得了客戶端傳過來的隨機值(私鑰),而後把內容經過該值進行對稱加密。所謂對稱加密就是,將信息和私鑰經過某種算法混合在一塊兒,這樣除非知道私鑰,否則沒法獲取內容,而正好客戶端和服務端都知道這個私鑰,因此只要加密算法夠彪悍,私鑰夠複雜,數據就夠安全。
傳輸加密後的信息
這部分信息是服務段用私鑰加密後的信息,能夠在客戶端被還原
客戶端解密信息
客戶端用以前生成的私鑰解密服務段傳過來的信息,因而獲取瞭解密後的內容。整個過程第三方即便監聽到了數據,也一籌莫展。
非對稱加密算法的性能是很是低的,緣由在於尋找大素數、大數計算、數據分割須要耗費不少的CPU週期,因此通常的HTTPS鏈接只在第一次握手時使用非對稱加密,經過握手交換對稱加密密鑰,在以後的通訊走對稱加密。