生成 SHA 哈希字符串

Java常用方法   2025-01-12 11:50   138   0  

一、MessageDigest 支持的算法名称

package com.chenwc;

/**
 * MessageDigest 支持的算法枚举
 * 
 * @author 陈为成
 *
 */
public enum AlgorithmEnum {

    MD2("MD2"), 
    MD5("MD5"), 
    SHA_1("SHA-1"), 
    SHA_224("SHA-224"), 
    SHA_256("SHA-256"), 
    SHA_384("SHA-384"),
    SHA_512("SHA-512");
    //JDK 9 及之后版本支持
    //SHA_512_224("SHA-512/224"),
    //SHA_512_256("SHA-512/256"),
    //SHA3_224("SHA3-224"),
    //SHA3_256("SHA3-256"),
    //SHA3_384("SHA3-384"),
    //SHA3_512("SHA3-512");

    private String algorithm;

    AlgorithmEnum(String algorithm) {
        this.algorithm = algorithm;
    }

    public String getAlgorithm() {
        return algorithm;
    }

    public void setAlgorithm(String algorithm) {
        this.algorithm = algorithm;
    }

    /**
     * 根据算法名称获取 AlgorithmEnum
     * @param algorithm 算法名称
     * @return AlgorithmEnum
     */
    public AlgorithmEnum getAlgorithmEnum(String algo) {
        for (AlgorithmEnum algorithmEnum : AlgorithmEnum.values()) {
            if (algo.equals(algorithmEnum.getAlgorithm())) {
                return algorithmEnum;
            }
        }
        return null;
    }
}

二、基于 Java API

1、示例代码

package com.chenwc;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class ShaUtilsByJavaApi {

    /**
     * SHA哈希字符串
     * @param original 待加密字符串
     * @param algorithmEnum MessageDigest 支持的算法枚举
     * @return SHA哈希加密后字符串
     */
    public static String getShaHash(String original, AlgorithmEnum algorithmEnum) {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance(algorithmEnum.getAlgorithm());
            byte[] hash = messageDigest.digest(original.getBytes(StandardCharsets.UTF_8));
            return bytesToHex(hash);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 自定义字节到十六进制转换器来获取十六进制的哈希值
     * @param hash 二进制哈希值
     * @return 十六进制字符串哈希值
     */
    private static String bytesToHex(byte[] hash) {
        StringBuilder hexString = new StringBuilder();
        if (null != hash) {
            for (byte md5Byte : hash) {
                hexString.append(Integer.toHexString(md5Byte | 0xFFFFFF00).substring(6));
            }
        }
        return hexString.toString();
    }
}

三、基于 Apache Commons

1、依赖

commons-codec-1.15.jar

2、示例代码

package com.chenwc;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;


public class ShaUtilsByApacheCommons {

    /**
     * SHA哈希字符串
     * 
     * @param original      待加密字符串
     * @param algorithmEnum MessageDigest 支持的算法枚举
     * @return SHA哈希加密后字符串
     */
    public static String getShaHash(String original, AlgorithmEnum algorithmEnum) {
        byte data[] = null;
        try {
            data = DigestUtils.digest(MessageDigest.getInstance(algorithmEnum.getAlgorithm()),
                    original.getBytes(StandardCharsets.UTF_8));
        } catch (NoSuchAlgorithmException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        return Hex.encodeHexString(data);
    }
    /**
     * SHA-256哈希字符串
     * 
     * @param original      待加密字符串
     * @return SHA哈希加密后字符串
     */
    public static String getSha256(String original) {
        return DigestUtils.sha256Hex(original);
    }
    /**
     * SHA-1哈希字符串
     * 
     * @param original      待加密字符串
     * @return SHA哈希加密后字符串
     */
    public static String getSha1(String original) {
        return DigestUtils.sha1Hex(original);
    }
    /**
     * SHA-384哈希字符串
     * 
     * @param original      待加密字符串
     * @return SHA哈希加密后字符串
     */
    public static String getSha384(String original) {
        return DigestUtils.sha384Hex(original);
    }
    /**
     * SHA-512哈希字符串
     * 
     * @param original      待加密字符串
     * @return SHA哈希加密后字符串
     */
    public static String getSha512(String original) {
        return DigestUtils.sha512Hex(original);
    }
    /**
     * MD2哈希字符串
     * 
     * @param original      待加密字符串
     * @return SHA哈希加密后字符串
     */
    public static String getMd2(String original) {
        return DigestUtils.md2Hex(original);
    }
    /**
     * MD5哈希字符串
     * 
     * @param original      待加密字符串
     * @return SHA哈希加密后字符串
     */
    public static String getMd5(String original) {
        return DigestUtils.md5Hex(original);
    }
}

四、基于 Google Guava

1、依赖

guava-31.1-jre.jar

2、示例代码

package com.chenwc;

import java.nio.charset.StandardCharsets;

import com.google.common.hash.Hashing;

public class ShaUtilsByGuava {

    /**
     * SHA哈希字符串
     * 
     * @param original      待加密字符串
     * @param algorithmEnum MessageDigest 支持的算法枚举
     * @return SHA哈希加密后字符串
     */
    @SuppressWarnings("deprecation")
    public static String getShaHash(String original, AlgorithmEnum algorithmEnum) {
        String hash = "";
        switch(algorithmEnum) {
            case MD5:
                hash =  Hashing.md5().hashString(original, StandardCharsets.UTF_8).toString();
                break;
            case SHA_1:
                hash =  Hashing.sha1().hashString(original, StandardCharsets.UTF_8).toString();
                break;
            case SHA_256:
                hash =  Hashing.sha256().hashString(original, StandardCharsets.UTF_8).toString();
                break;
            case SHA_384:
                hash =  Hashing.sha384().hashString(original, StandardCharsets.UTF_8).toString();
                break;
            case SHA_512:
                hash =  Hashing.sha512().hashString(original, StandardCharsets.UTF_8).toString();
                break;
            default:
                hash = null;
                break;
        }
        return hash;
    }
}

五、基于 Bouncy Castle

同 Java API 类似,只是最后一步将字节转换为十六进制使用了 org.bouncycastle.util.encoders.Hex 实现

1、依赖

bcprov-jdk15on-1.70.jar

2、示例代码

package com.chenwc;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

import org.bouncycastle.util.encoders.Hex;

public class ShaUtilsByBouncyCastle {

    /**
     * SHA哈希字符串
     * @param original 待加密字符串
     * @param algorithmEnum MessageDigest 支持的算法枚举
     * @return SHA哈希加密后字符串
     */
    public static String getShaHash(String original, AlgorithmEnum algorithmEnum) {
        try {
            MessageDigest digest = MessageDigest.getInstance(algorithmEnum.getAlgorithm());
            byte[] hash = digest.digest(original.getBytes(StandardCharsets.UTF_8));
            return new String(Hex.encode(hash));
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return null;
    }
}

六、测试

package com.chenwc;

import java.util.UUID;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
        System.out.println("UUID: " + uuid);

        System.out.println("-------------------------Java API--------------------");
        for (AlgorithmEnum algorithmEnum : AlgorithmEnum.values()) {
            System.out.println(algorithmEnum.getAlgorithm() + ": \t" + ShaUtilsByJavaApi.getShaHash(uuid, algorithmEnum));
        }
        System.out.println();
        System.out.println("-------------------------Apache Commons--------------------");
        for (AlgorithmEnum algorithmEnum : AlgorithmEnum.values()) {
            System.out.println(algorithmEnum.getAlgorithm() + ": \t" + ShaUtilsByApacheCommons.getShaHash(uuid, algorithmEnum));
        }
        System.out.println();
        System.out.println("-------------------------Google Guava--------------------");
        for (AlgorithmEnum algorithmEnum : AlgorithmEnum.values()) {
            System.out.println(algorithmEnum.getAlgorithm() + ": \t" + ShaUtilsByGuava.getShaHash(uuid, algorithmEnum));
        }
        System.out.println();
        System.out.println("-------------------------Bouncy Castle--------------------");
        for (AlgorithmEnum algorithmEnum : AlgorithmEnum.values()) {
            System.out.println(algorithmEnum.getAlgorithm() + ": \t" + ShaUtilsByBouncyCastle.getShaHash(uuid, algorithmEnum));
        }
    }

}


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。