MD5Util、SHA1Util、HmacMD5Util、HmacSHAUtil

vqfq6057 8年前發布 | 5K 次閱讀 Java

MD5Util.java    

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;


public class MD5Util {

    /*
     * 注:
     * 1、 Message Digest Algorithm MD5將任意長度的“字節串”映射為一個128bit的大整數,并且是通過該128bit反推原始字符串是困難的
     * 2、2004年8月17日的美國加州圣巴巴拉的國際密碼學會議(Crypto’2004)上,來自中國山東大學的王小云教授做了破譯MD5、HAVAL-128、 
     * MD4和RIPEMD算法的報告,公布了MD系列算法的破解結果。宣告了固若金湯的世界通行密碼標準MD5的堡壘轟然倒塌,
     * 引發了密碼學界的軒然大波。(注意:并非是真正的破解,只是加速了雜湊沖撞)
     */

    public static final String ALGORITHM = "MD5";

    public static byte[] encode(byte[] content){
        try{
            MessageDigest digest = MessageDigest.getInstance(ALGORITHM);
            digest.update(content);
            return digest.digest();
        }catch(NoSuchAlgorithmException e){

        }
        return null;
    }

    public static void main(String[] args) {

        System.out.println(Arrays.toString(encode("Message Digest Algorithm MD5(中文名為消息摘要算法第五版)為計算機安全領域廣泛使用的一種散列函數".getBytes())));
        System.out.println(HexUtil.encode(encode("Message Digest Algorithm MD5(中文名為消息摘要算法第五版)為計算機安全領域廣泛使用的一種散列函數".getBytes())));

        /*
         * 控制臺輸出:
         * 
         * [95, 17, 75, 31, 32, -4, -66, 12, -49, 38, -59, -64, 17, 54, -97, -115]
         * 5F114B1F20FCBE0CCF26C5C011369F8D
         */
    }

}

SHA1Util.java    

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;


public class SHA1Util {

    /*
     * 注:
     * 1、安全哈希算法(Secure Hash Algorithm)主要適用于數字簽名標準 (Digital Signature Standard DSS)里面定義的
     * 數字簽名算法(Digital Signature Algorithm DSA)。對于長度小于2^64位的消息,SHA1會產生一個160位的消息摘要。
     * 2、SHA-1與MD5的比較:前者在長度上長32 位;強行攻擊有更大的強度
     * 3、MD5輸出128bit、SHA1輸出160bit、SHA256輸出256bit、另外還有SHA244,SHA512,分別輸出244bit,512bit
     */

    public static final String ALGORITHM = "SHA1";

    public static byte[] encode(byte[] content){
        try{
            MessageDigest digest = MessageDigest.getInstance(ALGORITHM);
            digest.update(content);
            return digest.digest();
        }catch(NoSuchAlgorithmException e){

        }
        return null;
    }

    public static void main(String[] args) {

        System.out.println(Arrays.toString(encode("對于長度小于2^64位的消息,SHA1會產生一個160位的消息摘要。".getBytes())));
        System.out.println(HexUtil.encode(encode("對于長度小于2^64位的消息,SHA1會產生一個160位的消息摘要。".getBytes())));

        /*
         * 控制臺輸出:
         * 
         * [-122, 88, 39, 32, 97, 76, -67, -82, 16, -67, -64, 34, -121, 41, 30, 95, 12, 80, 71, 31]
         * 86582720614CBDAE10BDC02287291E5F0C50471F
         */
    }

}

HmacMd5Util.java    

import java.security.SecureRandom;
import java.util.Arrays;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


public class HmacMD5Util {

    /*
     * 注:
     * 1、mac(Message Authentication Code,消息認證碼算法)是含有密鑰散列函數算法,兼容了MD和SHA算法的特性,并在此基礎上加上了密鑰。
     * 因此MAC算法也經常被稱作HMAC算法。
     * 2、經過mac算法得到的摘要值的長度與實現算法的摘要值長度相同
     * 3、MAC系列算法支持表
     * 算法   摘要長度    備注
     * HmacMD5  128 JAVA6實現
     * HmacSHA1 160 JAVA6實現
     * HmacSHA256   256 JAVA6實現
     * HmacSHA384   384 JAVA6實現
     * HmacSHA512   512 JAVA6實現
     * HmacMD2  128 BouncyCastle實現
     * HmacMD4  128 BouncyCastle實現
     * HmacSHA224   224 BouncyCastle實現
     */

    public static final String ALGORITHM = "HmacMD5";

    public static byte[] generateKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        SecretKey secretKey = keyGenerator.generateKey();
        return secretKey.getEncoded();
    }

    public static byte[] generateKey(byte[] seed) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        keyGenerator.init(new SecureRandom(seed));
        SecretKey secretKey = keyGenerator.generateKey();
        return secretKey.getEncoded();
    }

    public static byte[] encode(byte[] content, byte[] key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        mac.init(secretKey);
        return mac.doFinal(content);
    }

    public static void main(String[] args) throws Exception {

        byte[] key = generateKey();
        System.out.println(Arrays.toString(key));
        System.out.println(key.length);
        System.out.println(Arrays.toString(encode("兼容了MD和SHA算法的特性,并在此基礎上加上了密鑰。".getBytes(), key)));

        /*
         * 控制臺輸出:
         *
         * [-83, 61, 100, -52, -103, 38, 68, 18, 8, -49, 80, 52, 12, 63, -15, 75, 109, -27, 122, -83, 18, -101, 118, -83, 29, -80, -90, -23, 19, -25, 40, 1, 58, -33, -5, 9, 71, 114, 105, 29, -88, -128, -115, -29, 6, 107, 53, -47, -34, 31, 116, 55, -112, -64, 120, 27, -74, 106, -60, -7, 86, -35, 88, 103]
         * 64
         * [109, -70, 24, 124, -72, -71, 34, -43, -111, 7, 57, 90, 59, -77, 85, 57]
         */
    }

}

HmacSHA1Util.java    

import java.security.SecureRandom;
import java.util.Arrays;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


public class HmacSHA1Util {


    public static final String ALGORITHM = "HmacSHA1";

    public static byte[] generateKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        SecretKey secretKey = keyGenerator.generateKey();
        return secretKey.getEncoded();
    }

    public static byte[] generateKey(byte[] seed) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        keyGenerator.init(new SecureRandom(seed));
        SecretKey secretKey = keyGenerator.generateKey();
        return secretKey.getEncoded();
    }

    public static byte[] encode(byte[] content, byte[] key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        mac.init(secretKey);
        return mac.doFinal(content);
    }

    public static void main(String[] args) throws Exception {

        byte[] key = generateKey();
        System.out.println(Arrays.toString(key));
        System.out.println(key.length);
        System.out.println(Arrays.toString(encode("兼容了MD和SHA算法的特性,并在此基礎上加上了密鑰。".getBytes(), key)));

        /*
         * 控制臺輸出:
         *
         * [49, -56, 99, 31, -61, 125, -108, 27, 82, -1, 95, -88, 17, 11, 39, 59, 24, 11, 97, 83, -126, 62, -69, 63, -40, 90, -61, 73, 68, -9, 81, -6, 43, -8, 69, 113, 63, 79, -122, -64, 36, -32, -17, -121, -15, -83, -76, 17, -75, -74, -97, 104, -95, -9, -107, -30, -76, -68, 24, 111, 124, 21, -108, 53]
         * 64
         * [-7, -11, -3, -91, -118, 102, 60, 5, -92, 105, 70, 69, -1, -99, -10, 38, -80, 20, -112, -1]
         */
    }

}
 本文由用戶 vqfq6057 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!