對稱數據加密技術是當前應用最廣泛、使用頻率最高的加密技術,對稱加密算法是雙向可逆的,加密密鑰和解密密鑰相同是最大的特點。對稱加密算法由古典加密算法演變而來,大部分加密算法的解密算法是逆運算。
特點
對稱加密算法有20多種,對稱加密算法有如下特點:
- 加密和解密密鑰是一致的;
- 安全程度依賴於密鑰長度;
- 每種算法對密鑰的長度是有一定要求的;
- 大部分是分組加密算法,所以算法需要指定工作模式、填充類型。
一般對稱加密算法的加密流程
一般對稱加密算法的加密流程大概如下:
- 1.將要加密的數據進行分組,按照N位爲一組這就是
分組
過程,也就是分組加密
的由來; - 2.以組爲單位進行加密處理,這個時候對每塊的加密操作就有了不同的
工作模式
;
- 不同的工作模式算法效率和產生的密文差別比較大;
- 3.最後一塊兒不足N位,則需要填充到N位,這就是
填充模式
;
- 不同的填充模式,影響到數據的安全性;
由上可知,對稱加密算法中,非常重要的幾個概念如下:
- 密鑰:不是隨意指定的,是需要計算機計算出來的;
- 算法:選擇哪種算法極大程度的決定了加密安全級別;
- 工作模式:算法的工作模式決定了算法的效率和算法安全性;
- 填充模式:使用哪種填充方式,能一定程度上干擾數據的破譯工作;
1.密鑰長度
對稱加密算法的安全程度依賴於密鑰長度,而密鑰長度不是說變就變得,這需要算法能支持。密碼長度越長則加密級別越高,數據內容越安全,JAVA僅僅支持56位長度的DES加密。
2.工作模式
加密算法應用的場景比較複雜,有的強調效率,有的強調安全,有的強調容錯,這就出現了不同的工作模式。根據加密時每個密碼塊兒之間的關聯方式分爲:
- ECB:電子密碼本,最基本、最易理解的工作模式,每次加密都產生獨立的密碼組,每組的加密結果不影響,相同的組產生的密文相同;
- 優點:易於理解,簡單一些,沒有誤差傳遞,便於實現並行操作;
- 缺點:不能因此明文模式,有規律可尋
- 用途:時候加密碼密碼,隨機數,也就是明文重複小的數據;
- CBC:密文鏈接模式,目前應用最廣泛的模式,每組之間互相影響,加密前,明文數據與前一組的密文進行異或運算,需要選擇初始化向量;
- 優點:加密後的密文上下文關聯,不會有重複密文,攻擊性低;
- 缺點:加密效率低,不利於並行計算,有誤差傳遞問題。
- 用途:可加密任意長度的數據。
- CFB:密文反饋模式,比較複雜,也是上下文關聯的,按8位分組將密文和明文進行異或運算;
- 優點:隱藏了明文模式,可以按字節諸葛進行加解密;
- 缺點:不利於並行計算,錯誤會擴散,需要初始化向量;
- 用途:可用於檢測發現密文的篡改。
- OFB:輸出反饋模式,和CFB類似,不過OFB用前N位密碼進行異或運算;
- 優點:隱藏明文模式,無誤差傳遞;
- 缺點:不利於並行計算;比CFB安全性差;
- 用途:使用與加密冗餘性較大的數據,比如語言、圖像數據。
- CRT:計數模式,AES中經常使用CRT和CBC模式,上下文無關聯的;
- 優點:可並行計算,與CBC模式一樣的安全性;
- 缺點:沒有錯誤傳播,不易確保數據的完整性;
- 用途:各種加密用途。
一般如果數據重複性不高選擇CBC模式,重複性高選擇CFB或者OFB模式,AES經常用CRT模式。
3.填充模式
DES的分組過程中,最後一塊兒不足56位的時候,需要對最後一塊進行填充,這個時候就用到了填充模式:
- NoPadding:不填充;
- PKCS5Padding:常用的填充模式。
應用
廣泛的應用在各種需要數據加密的場景下,如很多Token則採用這種加密手段加密數據內容。只要需要加密的地方可以優先考慮使用對稱加密技術。
算法家族
目前Java中對稱加密算法大約有20多種,比較有代表性的算法有5種:
- DES:數據加密標準,經典加密算法,由IBM創建提交給美國國家標準局,是對稱加密算法的基礎;
- DESede:俗稱3DES,又稱Triple DES,是對DES的改良,採用多重迭代的方式加密;
- AES:DES的替代者,更安全,密鑰設置快,效率高,支持的密鑰長(128、192、256);
- PBE:基於口令的加密,算是對稱加密的特例,屬於信息摘要算法和對稱加密算法的融合;
- IDEA:國際數據加密標準,這是脫離了美國政府的限定產生的標準,強加密算法,常用在電子郵件加密中,比如PGP的核心算法。
- 其他:Blowfish、Twofish、Serpent、IDEA
算法供應商
信息摘要算法很多受美國出口的限制,對稱加密更是如此,尤其是能支持長密鑰加密的對稱加密算法,JDK 6僅支持一些密鑰長度比較短的加密算法,如56位密鑰的DES,112位的3DES,128位的AES。
對於高級的加密算法,可以考慮使用Bouncy Castle的開源Jar包。
算法選擇
目前DES已經不安全了,優先考慮使用AES加密,IDEA要根據自己的場景考慮,不建議一般應用,PBE要看和哪種算法融合。