Java常用加密演算法(一)—單向加密演算法(MD5/SHA)

凌浩雨發表於2017-08-27
  1. MD5加密

    MD5以512位分組來處理輸入的資訊,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位雜湊值。
    在MD5演算法中,首先需要對資訊進行填充,使其位長對512求餘的結果等於448。因此,資訊的位長(Bits Length)將被擴充套件至N512+448,N為一個非負整數,N可以是零。填充的方法如下,在資訊的後面填充一個1和無數個0,直到滿足上面的條件時才停止用0對資訊的填充。然後,在這個結果後面附加一個以64位二進位制表示的填充前資訊長度。經過這兩步的處理,資訊的位長=N512+448+64=(N+1)*512,即長度恰好是512的整數倍。這樣做的原因是為滿足後面處理中對資訊長度的要求。

/**
 * MD5 加密工具類
 * @author mazaiting
 */
public class Md5Util {
    
    /**
     * MD5 加密 生成32位MD5碼
     * @param source 需要加密的字串
     * @return 32位MD5碼
     */
    public static String encode(String source) {
        try {
            // 獲得MD5 訊息摘要
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            // 獲得指定編碼的位元組資料
            byte[] sourceBytes = source.getBytes("UTF-8");
            // 指定的位元組陣列對摘要執行最終更新
            byte[] digestBytes = messageDigest.digest(sourceBytes);
            StringBuffer hexValue = new StringBuffer();
            
            for (int i = 0; i < digestBytes.length; i++) {
                int val = (digestBytes[i] & 0xff);
                if (val < 16){
                    hexValue.append("0");
                }
                hexValue.append(Integer.toHexString(val));
            }
            
            return hexValue.toString(); 
        } catch (NoSuchAlgorithmException e) {
            return null;// 獲得MD5 訊息摘要異常
        } catch (UnsupportedEncodingException e) {
            return null;// 獲得指定編碼的位元組資料異常
        }       
    }
    
}
  1. SHA
    SHA是一種資料加密演算法,該演算法經過加密專家多年來的發展和改進已日益完善,現在已成為公認的最安全的雜湊演算法之一,並被廣泛使用。該演算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預對映或資訊),並把它們轉化為長度較短、位數固定的輸出序列即雜湊值(也稱為資訊摘要或資訊認證程式碼)的過程。雜湊函式值可以說是對明文的一種“指紋”或是“摘要”所以對雜湊值的數字簽名就可以視為對此明文的數字簽名。
    安全雜湊演算法SHA(Secure Hash Algorithm,SHA)是美國國家標準技術研究所釋出的國家標準FIPS PUB 180,最新的標準已經於2008年更新到FIPS PUB 180-3。其中規定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512這幾種單向雜湊演算法。SHA-1,SHA-224和SHA-256適用於長度不超過264二進位制位的訊息。SHA-384和SHA-512適用於長度不超過2128二進位制位的訊息。

/**
 * 採用SHA 加密
 * @author mazaiting
 */
public class SHAUtil {
    /**
     * SHA 加密 生成40位SHA碼
     * @param source 待加密字串
     * @return 返回40位SHA碼
     */
    public static String encode(String source) {
        try {
            // 獲取SHA的訊息摘要
            MessageDigest messageDigest = MessageDigest.getInstance("SHA");
            // 獲取指定編碼的字串位元組陣列
            byte[] sourceBytes = source.getBytes("UTF-8");
            // 對指定位元組資料進行更新
            byte[] digestBytes = messageDigest.digest(sourceBytes);
                
            StringBuffer hexValue = new StringBuffer();
            for (int i = 0; i < digestBytes.length; i++) {
                int val = (digestBytes[i] & 0xff);
                if (val < 16) {
                    hexValue.append("0");
                }
                hexValue.append(Integer.toHexString(val));
            }
            
            return hexValue.toString();
        } catch (NoSuchAlgorithmException e) {
            return null;// 獲取SHA的訊息摘要異常
        } catch (UnsupportedEncodingException e) {
            return null;// 獲取指定編碼的字串位元組陣列失敗
        }       
    }
}


相關文章