开发中的几种加密算法的使用场景
數據傳輸過程中的加密是程序開發中避不開的一個問題。如何更科學更合理的使用加密算法也就成了一個開發人員必須了解的知識點,本文就該問題做簡單的介紹。
注意:這些算法的詳細知識不屬于本文的范圍。本文主要是根據其特點,說明如何在開發中合理使用這些算法。
常見的加密算法:
加密算法有很多,這里只列出開發中常用的幾種。
單向散列哈希算法
代表:
MD5、SHA(128、256)系列
簡介:
嚴格來講這不算是一種加密算法,應該叫做?信息摘要算法?。也是目前開發中應用非常廣的算法。
散列函數(英語:Hash function)又稱?散列算法、哈希函數,是一種從任何一種數據中創建小的數字“指紋”的方法。散列函數把消息或數據壓縮成摘要,使得數據量變小,將數據的格式固定下來。該函數將數據打亂混合,重新創建一個叫做?散列值(hash values,hash codes,hash sums,或 hashes)的指紋。散列值通常用一個短的隨機字母和數字組成的字符串來代表。好的散列函數在輸入域中很少出現?散列沖突?。在?散列表?和?數據處理?中,不抑制沖突來區別數據,會使得?數據庫記錄?更難找到。
單向散列函數以下幾個特點,決定了其有很高的使用價值。
單向散列函數是一種不可逆的信息摘要算法,無法通過密文還原成明文(注意:是算法上不能實現),對于簡單的 MD5 加密(這里的簡單是指:明文長度短,且字符單一,并且進行 HASH 操作的時候沒有進行加鹽處理),是可以通過一些在線工具網站解密出來,實則是利用了彩虹表的技術,大家可以自行 Google Search 一下。
目前在開發中 單向散列函數?主要可以用在下面這些情況:
用于生成信息的摘要,校驗數據的完整性:
比如要比兩個數據對象的是不是完全一樣,我們可以先對兩個數據對象進行 hash 操作,然后對比兩個數據對象的 hash 值,如果相同,則認為這兩個數據對象是一樣。這種作用實際上很常用,如下圖:
基于該特性,還可以在文件上傳存儲中為避免文件重名問題,使用該算法為每一個文件生成一個唯一的 ID(當然還可以使用 UUID)。更多場景大家可以自行腦補。
用于密碼存儲
密碼存儲是一個開發中很常見的問題,正式的應用項目數據庫中密碼的存儲一定不會是明文存儲的。既然要密文存儲,那么可選的加密方法又會有很多種,到底是選對稱的加密算法、還是非對稱的加密算法、還是使用單向散列函數,還是使用多種組合?
這個肯定要結合?實際應用場景?和?系統對安全性的要求?等因素來考慮。考不過無論是使用 對稱還是非對稱,這個都需要考慮秘鑰的存儲管理,如果管理不合理,秘鑰泄露,那么密碼就無異于裸奔。同時考慮到系統管理員是帶有主觀因素的人,慮到這些情況,其實在一般的應用系統中,我們是可以使用 單向散列函數 來解決這個問題,這里最主要是利用了單向散列函數的單向性,這個單向性排除了人的因素,一旦使用了 單向散列函數 那么即使管理員能夠看到加密之后的內容,但是他也難以得到明文,因為單向散列函數是理論上不可逆的。
但是去查資料可以知道,其實 MD5、SHA256 等已經不在安全,特別是直接使用 MD5、SHA256等單向散列函數是很不推薦的,最好的方式是在使用 單向散列函數處理之前對明文進行 “加鹽處理”,這樣再限定一下密碼長度跟復雜度,就極大地提供了密碼的安全性。所以使用 單向散列函數 配合 加鹽、密碼強渡校驗 等措施后完全可以滿足我們普通項目的需求:簡單、實用、合理的安全性保障。
對稱加密算法
代表:
常見的對稱加密算法有?DES、3DES、AES、Blowfish、IDEA、RC5、RC6。
特性:
簡單來說就是加密與解密用的都是同一個秘鑰。
優點:
通常情況下,在通用計算機中,相比非對稱加密算法,對稱加密算法效率會明顯比較高。這個自己做過嘗試,效果還是很明顯的。
使用場景:
由于算法效率較高,一般用于對效率有要求的實時數據加密通信。比如在使用 VPN 或者代理進行 加密通信時,既要保證數據的保密性,又要保證不能有高的延遲,所以通常會使用對稱加密算法。
非對稱加密算法(又稱:公開密鑰加密算法)
代表:
RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫爾曼密鑰交換協議中的公鑰加密算法、橢圓曲線加密算法(英語:Elliptic Curve Cryptography, ECC)。使用最廣泛的是RSA算法(由發明者Rivest、Shmir和Adleman姓氏首字母縮寫而來)是著名的公開秘鑰加密算法,ElGamal是另一種常用的非對稱加密算法。
特性:
它需要兩個密鑰,一個是公鑰,另一個是私鑰,一個用于加密,另一個用于解密。如果其中一個密鑰用于加密明文,則原始明文只能用對應的另一個密鑰解密;即使最初用于加密明文的密鑰也不能用作解密。因為加密和解密需要兩個不同的密鑰,所以稱為非對稱加密。
PS:通常情況下,公鑰的長度一般比較短,所以我們會將公鑰對外公開,讓別人使用公鑰來加密數據。而我則使用私鑰解密數據,但是切記基于非對稱的特性,我們也是可以使用公開私鑰加密,而使用公鑰解密。之所以不這樣做僅僅是因為私鑰通常比公鑰要長,傳輸起來比較費資源而已。
優點:
參考特性。
主要應用場景:
標題主要用于秘鑰交換,證書等場景。
基于公鑰密碼學的特點,它還提供了數字簽名的功能(如左圖),使電子文檔能夠在紙質文檔上獲得親自簽名的效果。
公鑰基礎設施(PKI)通過信任數字證書頒發機構的根證書并使用公鑰加密來發布數字簽名,從而形成信任鏈體系結構。它已經在 TLS 中實現,并在萬維網的 HTTPS 和電子郵件的 SMTP 的 STARTTLS 中引入。
另一方面,信任網絡采用分權的概念,而不是依賴數字證書認證機構的公鑰基礎設施,因為每個電子證書在信任鏈中只有一個根證書授權,信任網絡的公鑰可以累積多個用戶的信任。PGP 就是一個例子。
?
對稱與非對稱的比較:
分析這兩種算法的特點可以知道,單純的使用 對稱加密(如:AES)? 的來加密兩者傳輸中的數據的時候首先要讓雙方要知道秘鑰是什么,可問題就是這個秘鑰的傳輸是一個問題,直接通過網絡傳輸是極其不安全的。因為網絡一旦被監聽,這個秘鑰就沒有存在的意義了,而監聽一個網絡,難度并不是很大,所以我們不能直接使用 AES 。
再來看非對稱加密算法(如:RSA),由于RSA是非對稱的加密算法,私鑰用來解密,公鑰用來加密,公鑰之所以帶“公”,也是因為其本身就是就需要對外公開的,并不需要保密。這樣對于通信雙方來說,建立鏈接之后的第一件事就是雙方分發自己的公鑰給對方,一端數據傳輸給對方的時候,先使用接收方發過來的公鑰對數據進行加密后再發送,之后接收方會使用自己的私鑰解密數據得到明文,然后再使用對方的公鑰加密敏感的響應數據,之后再發送給對方,對方拿自己的私鑰解密。這樣就完成了數據的加密傳輸通信。我們分析這個過程可以知道,整個傳輸過程中,只是對外暴露了公鑰,這時即使黑客拿到了公鑰,但是也無法解密傳輸過程中的數據,因為只有私鑰才能解密數據。這樣看起來就完美的解決了雙方的加密通信問題。但是有這種加密算法相比 AES 比較耗資源,對于一個訪問量比較大的web服務來說,是不推薦的。
對稱加密 和 非對稱加密 的結合:
通過上面的分析,我們結合兩者的優點,創建新的使用模式。先來張圖做一個簡單介紹
從上圖可以看出,當客戶端要與服務器端通信的時候,客戶端先使用?RSA?算法生成自己的公鑰和私鑰,然后把公鑰以明文的方式發送給服務器,服務器拿到公鑰,并使用從客戶端接收到的公鑰對 AES?的秘鑰進行加密然后返回給客戶端。客戶端接收到加密后的 AES?秘鑰后就可以直接使用自己的私鑰解密 AES?的秘鑰,從而得到?AES?秘鑰明文。之后兩者的通信就可以使用?AES來實現敏感信息的加密了。這個操作就即解決了?AES?秘鑰的傳輸問題,又解決了?RSA?算法效率不高的問題。
總結
以上是生活随笔為你收集整理的开发中的几种加密算法的使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入浅出 Javascript 事件
- 下一篇: Java开发中的几种对象的说明(PO,V