SHA加密算法

SHA简介

安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
  目前SHA有五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,也是美国的政府标准,后四者有时并称为SHA-2。

SHA家族特点

Sha-1 Sha-224 Sha-256 Sha-384 Sha-512
消息摘要长度 160 224 256 384 512
消息长度 264 264 264 264 2128
字长度 32 32 32 32 64
分组长度 512 512 512 1024 1024
步骤数 80 64 64 80 80

工具类

package com.dbl.util;

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

/**
 * @Author 大菠萝
 * @Create 2024/7/4 13:17
 * Description: SHA 系列算法加密工具类
 */
public class SHAUtil {

    private static final String SHA_1 = "SHA-1";
    private static final String SHA_224 = "SHA-224";
    private static final String SHA_256 = "SHA-256";
    private static final String SHA_384 = "SHA-384";
    private static final String SHA_512 = "SHA-512";

    public static String getSHA1(String str, boolean uppercase) {
        return getSHA(str, SHA_1, uppercase);
    }

    public static String getSHA224(String str, boolean uppercase) {
        return getSHA(str, SHA_224, uppercase);
    }

    public static String getSHA256(String str, boolean uppercase) {
        return getSHA(str, SHA_256, uppercase);
    }

    public static String getSHA384(String str, boolean uppercase) {
        return getSHA(str, SHA_384, uppercase);
    }

    public static String getSHA512(String str, boolean uppercase) {
        return getSHA(str, SHA_512, uppercase);
    }

    /**
     * 利用Java原生摘要实现SHA加密(支持大小写,默认小写)
     *
     * @param str       要加密的数据
     * @param algorithm 要使用的算法(SHA-1,SHA-2224,SHA-256,SHA-384,SHA-512)
     * @param uppercase 是否转为大写
     * @return
     */
    private static String getSHA(String str, String algorithm, boolean uppercase) {
        byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
        MessageDigest messageDigest;
        try {
            //获得SHA转换器
            messageDigest = MessageDigest.getInstance(algorithm);
            //bytes是输入字符串转换得到的字节数组
            messageDigest.update(bytes);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("SHA签名过程中出现错误,算法异常");
        }
        //转换并返回结果,也是字节数组,包含16个元素
        byte[] digest = messageDigest.digest();
        //字符数组转换成字符串返回
        String result = byteArrayToHexString(digest);
        //转换大写
        return uppercase ? result.toUpperCase() : result;

    }


    /**
     * 将字节数组转为16进制字符串
     *
     * @param bytes 要转换的字节数组
     * @return
     */
    private static String byteArrayToHexString(byte[] bytes) {
        StringBuilder builder = new StringBuilder();
        for (byte b : bytes) {
            //java.lang.Integer.toHexString() 方法的参数是int(32位)类型,
            //如果输入一个byte(8位)类型的数字,这个方法会把这个数字的高24为也看作有效位,就会出现错误
            //如果使用& 0XFF操作,可以把高24位置0以避免这样错误
            String temp = Integer.toHexString(b & 0xFF);
            if (temp.length() == 1) {
                //1得到一位的进行补0操作
                builder.append("0");
            }
            builder.append(temp);
        }
        return builder.toString();
    }

}

posted @ 2024-09-14 09:48  大菠萝zZ  阅读(94)  评论(0)    收藏  举报