[JAVA]数字摘要算法工具类——(Hamc)MD5/SHA1/SHA256/SHA512/PBKDF2

文章目录

  • API调取
  • 精简版的JAVA代码
  • 完整代码


API调取

方法 补充说明
getMD5 获得MD5摘要
getSHA1 获得SHA1摘要
getSHA256 获得SHA256摘要
getSHA512 获得SHA512摘要
getHmacMD5 获得HmacMD5摘要
getHmacSHA1 获得HmacSHA1摘要
getHmacSHA256 获得HmacSHA256摘要
getHmacSHA512 获得HmacSHA512摘要
getPBKDF2 默认迭代54次,产生32位密钥
getRandomSalt 获得一个定长的盐

注意:

  • 不适用于SHA384等非 2 i 2^i 2i长度的方法。如有需要,请重写toHex()方法
  • 默认加盐方式为"msg"+"salt",如需自定义请重写addSalt方法
  • 精简版代码中只包含MD5相关算法,可以参照该方法填充其它数字摘要算法。参考此处:完整摘要算法工具类Java代码封装

精简版的JAVA代码

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.security.spec.KeySpec;

public class MDBuilder {

    // 散列算法
    public static String getMD5(String msg, String salt){
        return MDBuilder.buildMD(msg, "MD5", salt);
    }
    // 哈希算法
    public static String getHmacMD5(String msg, String key, String salt){
        return MDBuilder.buildHmacMD(msg, "HmacMD5", key, salt);
    }
    // 产生具体的编码
    private static String buildMD(String msg, String algs, String salt){
        String retult="";
        try{
            MessageDigest md = MessageDigest.getInstance(algs);
            byte[] buff = md.digest(addSalt(msg,salt).getBytes());
            retult  = toHex(buff);
        }catch (Exception e){
            e.printStackTrace();
        }
        return retult;
    }

    private static String buildHmacMD(String msg, String algs, String key, String salt) {
        String result="";
        try{
            SecretKey sk = new SecretKeySpec(key.getBytes(),algs);
            Mac mac = Mac.getInstance(algs);
            mac.init(sk);
            byte[] buff = mac.doFinal(addSalt(msg, salt).getBytes());
            result = toHex(buff);
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

    // 对盐的添加方式
    private static String addSalt(String msg, String salt){
        return msg+salt;
    }

    // 迭代散列
    private static final int PBKDF2_ITERATIONS = 54;
    private static final int HASH_BIT_SIZE  = 32 * 4;
    /** @link https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#SecretKeyFactory */
    private static final String PBKDF2_ALGORITHM = "PBKDF2WithHmacSHA1";

    public static String getPBKDF2(String msg, String salt, int iterations){
        String result="";
        try{
            KeySpec spec = new PBEKeySpec(msg.toCharArray(), salt.getBytes(), iterations, HASH_BIT_SIZE);
            SecretKeyFactory f = SecretKeyFactory.getInstance(PBKDF2_ALGORITHM);
            result = toHex(f.generateSecret(spec).getEncoded());
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
    //将128位的二进制序列转为32位的16进制编码
    private static String toHex(byte[] bytes) {
        StringBuilder md5str = new StringBuilder();
        for (byte aByte : bytes) {
            int temp = aByte;
            if (temp < 0) temp += 256; // 0x8* 在经过toHexString转化时,会被转为ffffff8*,需要+256保证其正值
            if (temp < 16) md5str.append("0"); // 0x05 转化会变成 5,缺少一位0
            md5str.append(Integer.toHexString(temp));
        }
        return md5str.toString();
    }
	// 产生一个指定种子的Strong盐
    public static String getRandomSalt(int length, Long seed){
        String salt = "default";
        try{
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
            if(seed!=null)random.setSeed(seed);
            byte[] bytes = new byte[length / 2];
            random.nextBytes(bytes);
            //将byte数组转换为16进制的字符串
            salt = DatatypeConverter.printHexBinary(bytes);
        }catch (Exception e){
            e.printStackTrace();
        }
        return salt;
    }
}

完整代码

参考此处:完整摘要算法工具类Java代码封装

你可能感兴趣的:(网站,服务器,网络,通信,JAVA)