Java 常用加密解密演算法
概要
加密演算法是一種用數學方法對資料進行變換的技術,目的是保護資料的安全,防止被未經授權的人讀取或修改。加密演算法可以分為三大類:對稱加密演算法、非對稱加密演算法和雜湊演算法(也叫摘要演算法)。
本文來梳理下開發中常用到的資料編碼中的Base64以及常見的一些加密演算法。
一、資料編碼
1. Base64 演算法
Base64編碼本質上是一種將二進位制資料轉成文字資料的方案。對於非二進位制資料,是先將其轉換成二進位制形式,然後每連續6位元(2的6次方=64)計算其十進位制值,根據該值在A-Z,a-z,0-9,+,/ 這64個字元中找到對應的字元,最終得到一個文字字串。
1)可讀性編碼演算法
Base64演算法並不是加密演算法,它的出現是為了解決ASCII碼在傳輸過程中可能出現亂碼的問題。Base64是網路上最常見的用於傳輸8bit位元組碼的可讀性編碼演算法之一。可讀性編碼演算法不是為了保護資料的安全性,而是為了可讀性。可讀性編碼不改變資訊內容,只改變資訊內容的表現形式。
2)64種字元
Base64使用了64種字元:大寫A到Z、小寫a到z、數字0到9、“+”和“/”,故得此名。
Base64編碼對照表:
2. URL Base64演算法
UrlBase64 是 Base64 編碼的一種變體,主要用於在 URL 中安全地傳輸二進位制資料。它與標準的 Base64 編碼相比,有一些微小的差異,以確保編碼後的字元在 URL 中不會引起問題。
UrlBase64 主要有以下兩個特點:
1)字符集不同:在標準的 Base64 編碼中,使用字元 "+", "/",而這兩個字元在 URL 中有特殊的含義,可能會引起歧義或導致 URL 解析錯誤。為了解決這個問題,UrlBase64 將字元 "+" 替換為 "-", 將 "/" 替換為 "_"。
2)去掉填充字元: 標準的 Base64 編碼在最後可能會使用一個或兩個 "=" 字元進行填充,以使編碼後的字串長度是4的倍數。但是在 URL 中,這些填充字元可能引起問題,因此 UrlBase64 通常去掉填充字元,直接使用編碼後的字串。
總體而言,UrlBase64 是為了適應 URL 中的特殊需求而修改的 Base64 編碼。在處理需要在 URL 中傳遞的二進位制資料時,使用 UrlBase64 可以確保編碼後的字串在 URL 中是安全且可靠的。在使用 UrlBase64 解碼時,需要在解碼之前將 "_" 替換為 "/",將 "-" 替換為 "+",並根據需要新增填充字元。
二、雜湊演算法
雜湊演算法也叫雜湊函式或摘要演算法,它的作用是將任意長度的資料對映為固定長度的值的演算法,通常這個對映值稱為雜湊值(Hash Value)或者雜湊值或者訊息摘要。
1. 不屬於加密演算法
雜湊演算法其實不屬於加密演算法,只是可以用到某些加密場景中(例如密碼加密),兩者可以看作是並列關係。加密演算法通常指的是可以將明文轉換為密文,並且能夠透過某種方式(如金鑰)再將密文還原為明文的演算法。而雜湊演算法是一種單向過程,它將輸入資訊轉換成一個固定長度的雜湊值,但這個過程是不可逆的,也就是說,不能從雜湊值還原出原始資訊。
例如:雜湊函式 SHA-256 會將任意長度的輸入資料對映為一個固定長度的輸出(256 位),但無法透過輸出值反推出輸入資料。
2. 驗證資料完整性
相同的內容用同樣的摘要演算法獲得的雜湊值是一樣的,所以常用於驗證資料的完整性和一致性。
說明:原始資料的任何改變都會導致雜湊值的巨大變化。
3. 雜湊演算法分類
主要分為三大類:MD(Message Digest,訊息摘要演算法)、SHA(Secure HashAlgorithm,安全雜湊演算法)和MAC(Message Authentication Code,訊息認證碼演算法)
常見的雜湊演算法:
1)MD(Message Digest,訊息摘要演算法)
MD2、MD4、MD5 等,已經不被推薦使用。
2)SHA(Secure Hash Algorithm,安全雜湊演算法)
SHA-1 系列安全性低,SHA2,SHA3 系列安全性較高。
SHA-256 是最常用的,它提供了良好的安全性,並且計算效率適中,廣泛用於區塊鏈技術(例如比特幣)和數字簽名等場景。
3)Bcrypt(密碼雜湊演算法)
基於 Blowfish 加密演算法的密碼雜湊演算法,專門為密碼加密而設計,安全性高,屬於慢雜湊演算法。
4)MAC(Message Authentication Code,訊息認證碼演算法)
HMAC 是一種基於雜湊的 MAC,可以與任何安全的雜湊演算法結合使用,例如 SHA-256。
5)CRC:(Cyclic Redundancy Check,迴圈冗餘校驗)
CRC演算法是一種雜湊演算法,用於生成一個固定長度的值來表示資料的“指紋”。它基於多項式除法的原理,用於檢查資料的完整性。
CRC32 是一種 CRC 演算法,它的特點是生成 32 位的校驗值,通常用於資料完整性校驗、檔案校驗等場景。
CRC16 演算法生成的雜湊值通常為 16 位,在 Redis 中,通常透過 CRC16(key) & 16383 來得到雜湊槽的位置。
說明:CRC16 在處理較小的資料集時,衝突機率較低,雖然相比更強大的雜湊演算法(如 SHA 或 MD5)可能有一些碰撞的風險,但在 Redis 叢集的應用場景中,CRC16 仍然足夠滿足高效、快速的資料分配
5. 加密雜湊演算法和非加密雜湊演算法
雜湊演算法本身不涉及加密/解密操作。根據它們的用途和設計目標進行區分,可以簡單分為:
1)加密雜湊演算法:安全性較高的雜湊演算法,它可以提供一定的資料完整性保護和資料防篡改能力,能夠抵禦一定的攻擊手段,安全性相對較高,但效能較差,適用於對安全性要求較高的場景。例如 SHA2、SHA3、SM3、RIPEMD-160、BLAKE2、SipHash 等等。
2)非加密雜湊演算法:安全性相對較低的雜湊演算法,易受到暴力破解、衝突攻擊等攻擊手段的影響,但效能較高,適用於對安全性沒有要求的業務場景。例如 CRC32、MurMurHash3、SipHash 等等。
說明:在常用的簽名演算法中,雜湊演算法本身並不是簽名的獨立演算法,它通常是作為組成部分(資料摘要)與 HMAC、RSA、ECDSA 等加密演算法結合使用的。
6. 鹽值
鹽值通常用於雜湊演算法中,特別是在密碼儲存中,以增強雜湊計算的安全性。鹽值的目的主要是防止彩虹表攻擊和暴力破解。鹽值是一個隨機生成的字串,它會與原始資料(如密碼)一起參與雜湊計算,從而使得同樣的原始資料每次計算出的雜湊值都不相同。
三、對稱加密演算法
對稱加密演算法加密和解密使用的是同一份秘鑰,解密是加密的逆運算。對稱加密演算法加密速度快,密文可逆,一旦秘鑰檔案洩露,就會導致原始資料暴露。對稱加密的結果一般使用Base64演算法編碼,便於閱讀和傳輸。JDK8支援的對稱加密演算法主要有DES、DESede、AES、Blowfish,以及RC2和RC4等。不同的演算法秘鑰長度不同,秘鑰長度越長,加密安全性越高。
1. DES演算法
DES(Data Encryption Standard,資料加密標準)演算法是對稱加密演算法領域中的典型演算法,DES演算法秘鑰較短,以現在計算機的計算能力,DES演算法加密的資料在24小時內可能被破解。所以DES演算法已經被淘汰,建議使用AES演算法,不過這裡還是簡單瞭解下。
2. DESede演算法
作為DES演算法的一種改良,DESede演算法(也稱為3DES,三重DES)針對其秘鑰長度偏短和迭代次數偏少等問題做了相應改進,提高了安全強度,但同時也造成處理速度較慢、秘鑰計算時間加長、加密效率不高的問題。所以這裡還是簡單瞭解下,實際還是推薦用AES。
3. AES演算法
AES(AdvancedEncryption Standard,高階資料加密標準)演算法支援128位、192位和256位的秘鑰長度,加密速度比DES和DESede都快,至今還沒有被破解的報導。經過驗證,目前採用的AES演算法能夠有效抵禦已知的針對DES演算法的所有攻擊方法,如部分差分攻擊、相關秘鑰攻擊等。AES演算法因秘鑰建立時間短、靈敏性好、記憶體需求低等優點,在各個領域得到廣泛的研究與應用。
四、非對稱加密演算法
非對稱加密和對稱加密演算法相比,多了一把秘鑰,為雙秘鑰模式,一個公開稱為公鑰,一個保密稱為私鑰。遵循公鑰加密私鑰解密,或者私鑰加密公鑰解密。非對稱加密演算法源於DH演算法,後又有基於橢圓曲線加密演算法的金鑰交換演算法ECDH,不過目前最為流行的非對稱加密演算法是RSA。
RSA (Rivest–Shamir–Adleman algorithm):
RSA 演算法是是目前應用最廣泛的非對稱加密演算法,像 SSL/TLS、SSH 等協議中就用到了 RSA 演算法。
RSA演算法是一種基於大數分解的困難性的非對稱加密演算法,它需要選擇兩個大素數作為私鑰的一部分,然後計算出它們的乘積作為公鑰的一部分(尋求兩個大素數比較簡單,而將它們的乘積進行因式分解卻極其困難)。
1. 使用公鑰和私鑰
1)公鑰用於加密資料,確保資料機密性。
2)私鑰用於解密資料,或者用於數字簽名,確保資料的完整性和來源。
2. 資料交換過程
RSA演算法的資料交換過程分為如下幾步:
1)A 生成 RSA 金鑰對(包括公鑰和私鑰)。
2)A 向 B 釋出公鑰,使得 B 能用公鑰來加密資料。
3)A 使用 B 的公鑰加密資料,並將加密後的資料傳送給 B。
4)B 使用自己的私鑰解密資料,以獲取原始訊息。
5)B 使用 A 的公鑰加密資料,並將加密後的資料傳送給 A。
6)A 使用自己的私鑰解密資料,以獲取原始訊息。
RSA 演算法的優點是簡單易用,可以用於資料加密和數字簽名;缺點是運算速度慢,不適合大量資料的加密。
參考連結:
https://juejin.cn/post/7022798228492042276
https://javaguide.cn/system-design/security/encryption-algorithms.html