前言

我們在做java專案開發的時候,在前後端介面分離模式下,介面資訊需要加密處理,做簽名認證,還有在使用者登入資訊密碼等也都需要資料加密。資訊加密是現在幾乎所有專案都需要用到的技術,身份認證、單點登陸、資訊通訊、支付交易等場景中經常會需要用到加密演算法,所謂加密演算法,就是將原本的明文通過一系列演算法操作變成密文。

  1. BASE 嚴格地說,屬於編碼格式,而非加密演算法

    MD(Message Digest algorithm ,資訊摘要演算法)

    SHA(Secure Hash Algorithm,安全雜湊演算法)

    HMAC(Hash Message Authentication Code,雜湊訊息鑑別碼)

  2. 加密演算法中SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384,和SHA-512我們可以統稱為SHA2加密演算法

  3. SHA加密演算法的安全性要比MD5更高,而SHA2加密演算法比SHA1的要高。其中SHA後面的數字表示的是加密後的字串長度,SHA1預設會產生一個160位的資訊摘要。

MD5

MD5資訊摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出一個128位(16位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。

MD5演算法有以下特點:

  1. 壓縮性:無論資料長度是多少,計算出來的MD5值長度相同

  2. 容易計算性:由原資料容易計算出MD5值

  3. 抗修改性:即便修改一個位元組,計算出來的MD5值也會巨大差異

  4. 抗碰撞性:知道資料和MD5值,很小概率找到相同MD5值相同的原資料

準確來講,MD5不是一種加密演算法,而是一種摘要演算法,MD5能將明文輸出為128bits的字串,這個字串是無法再被轉換成明文的。網上一些MD5解密網站也只是儲存了一些字串對應的md5串,通過已經記錄的md5串來找出原文。

我做過的幾個專案中經常見到MD5用在加密上的場景。比如對密碼的加密,生成一個密碼後,使用MD5生成一個128位字串儲存在資料庫中,使用者輸入密碼後也先生成MD5串,再去資料庫裡比較。因此我們在找回密碼時是無法得到原來的密碼的,因為明文密碼根本不會被儲存。

SHA系列

  1. 安全雜湊演算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個密碼雜湊函式家族,是FIPS所認證的安全雜湊演算法。能計算出一個數字訊息所對應到的,長度固定的字串(又稱訊息摘要)的演算法。且若輸入的訊息不同,它們對應到不同字串的機率很高。
  2. 2005年8月17日的CRYPTO會議尾聲中王小云、姚期智、姚儲楓再度發表更有效率的SHA-1攻擊法,能在2的63次方個計算複雜度內找到碰撞。

也就是說SHA-1加密演算法有碰撞的可能性,雖然很小。

HMAC

  1. HMAC是金鑰相關的雜湊運算訊息認證碼(Hash-based Message Authentication Code)的縮寫,由H.Krawezyk,M.Bellare,R.Canetti於1996年提出的一種基於Hash函式和金鑰進行訊息認證的方法,並於1997年作為RFC2104被公佈,並在IPSec和其他網路協議(如SSL)中得以廣泛應用,現在已經成為事實上的Internet安全標準。它可以與任何迭代雜湊函式捆綁使用。
  2. HMAC演算法更像是一種加密演算法,它引入了金鑰,其安全性已經不完全依賴於所使用的Hash演算法

如果要使用加密,推薦使用SHA256、SHA384、SHA512以及HMAC-SHA256、HMAC-SHA384、HMAC-SHA512這幾種演算法。

對稱加密演算法

  1. 對稱加密演算法是應用比較早的演算法,在資料加密和解密的時用的都是同一個金鑰,這就造成了金鑰管理困難的問題。常見的對稱加密演算法有DES、3DES、AES128、AES192、AES256 (預設安裝的 JDK 尚不支援 AES256,需要安裝對應的 jce 補丁進行升級 jce1.7,jce1.8)。其中AES後面的數字代表的是金鑰長度。對稱加密演算法的安全性相對較低,比較適用的場景就是內網環境中的加解密。

  2. 所謂對稱加密,就是通過金鑰加密後可以再通過金鑰解密。我接觸過的某個國企現在內部就是採用AES的方式實現整合登陸。第三方系統提供一個接收使用者資訊的介面,該國企將使用者資訊AES加密後通過這個介面傳遞給第三方系統,第三方系統自行實現登陸操作。這裡需要注意的是金鑰十分重要,如果金鑰丟失,就有資訊洩漏的風險。

加密鹽

  1. 加密鹽也是比較常聽到的一個概念,鹽就是一個隨機字串用來和我們的加密串拼接後進行加密。

  2. 加鹽主要是為了提供加密字串的安全性。假如有一個加鹽後的加密串,黑客通過一定手段這個加密串,他拿到的明文,並不是我們加密前的字串,而是加密前的字串和鹽組合的字串,這樣相對來說又增加了字串的安全性。

線上加密網站

  1. 站長工具
  2. 線上加密
  3. Java開發加密解密工具類看我這一篇文章

總結

比較推薦的幾個加密演算法有:

  1. 不可逆加密:SHA256、SHA384、SHA512以及HMAC-SHA256、HMAC-SHA384、HMAC-SHA512

  2. 對稱加密演算法:AES、3DES

  3. 非對稱加密演算法:RSA

參考

  1. 常用的加密演算法
  2. 淺析五種最常用的Java加密演算法
  3. https://juejin.cn/post/6844903638117122056#heading-3