java实现消息摘要算法


前言

散列函数,也称作哈希函数、消息摘要函数。经常用到的MD5就属于这个范畴。本篇介绍什么是消息摘要、作用及几种实现方式


一、什么是消息摘要算法

消息摘要函数的主要作用不是完成数据的加密与解密工作的,它是用来验证数据完整性的重要技术。通过摘要函数,可以为数据创建“数字指纹”(散列值)。其认证流程图如下
消息摘要函数认证流程
特点:

  • 单向性,运算过程不可逆
  • 任意两个不同消息的散列值一定不同
  • 散列值不同,则原始消息一定不同
    各大软件厂商提供软件下载的时候会附带上数字指纹,如mysql
    在这里插入图片描述
    为了方便人们识别和阅读,数字指纹常以十六进制字符的串的形式出现

二、消息摘要算法家谱

散列函数家谱

1.MD算法

MD5算法是典型的消息摘要算法,它由MD4、MD3、MD2算法改进而来。无论是哪种MD算法,它们都需要获得一个随机长度的信息并产生一个128位的二进制信息摘要,转换成16进制就是32位的字符串。我们见到的大部分MD5算法的数字指纹都是32位十六进制的字符串。
随着计算机发展水平的提高,MD5算法已不再适合安全要求较高的场合

2.SHA算法

SHA算法基于MD4算法基础之上,其与MD算法不同之处在于摘要长度,SHA算法的摘要长度更长,安全性更高
发展历史:

  • SHA-0算法,1983年第一个版本,因降低密码安全性撤回
  • SHA-1算法,1995年发布,通常我们也把SHA-1算法简称为SHA算法。其在安全协定中使用广泛。包括TLS/SSL,SSH等。SHA-0和SHA-1算法可对最大长度为264的字节信息做摘要处理,得到160位的摘要信息,40为16进制的字符串
  • SHA-2算法,是SHA-224,SHA-256,SHA-384,SHA-512四种算法的总称。
    sha1算法的应用场景

3.MAC算法

MAC算法结合了MD5和SHA算法的优势,并加入了密钥的支持,是一种更为安全的消息摘要算法。我们也通常把MAC算法称为HMAC算法(keyed-Hash Message Authentication Code)
在这里插入图片描述
经MAC算法得到的摘要值长度与参与实现的算法摘要值长度相同。如,HmacSHA1得到的摘要长度就是160位二进制,换算成十六进制编码就是40位。

三、代码实现

1.引入jar包

这里引入辅助jar包

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.14</version>
</dependency>

2.MD5算法

实现细节

算法摘要长度备注
MD2128jdk实现
MD5128jdk实现
MD4128Bouncy Castle实现

代码

public class MDUtil {
    public static void main(String[] args) {
        md5("helloWorld");
    }

    public static void md5(String src) {
        String md5Hex = DigestUtils.md5Hex(src.getBytes(StandardCharsets.UTF_8));
        System.out.println(md5Hex);
    }
}

3.SHA256算法

实现细节

算法摘要长度备注
SHA-1160jdk实现
SHA-256256jdk实现
SHA-384384jdk实现
SHA-512512jdk实现
SHA-224224Bouncy Castle

代码

public class SHAUtil {
    public static void main(String[] args) {
        sha256("helloWorld");
    }

 
    private static void sha1(String src) {
        byte[] results = DigestUtils.sha1(src);
        System.out.println(Hex.encodeHexString(results));
    }
    private static void sha256(String src) {
        byte[] results = DigestUtils.sha256(src);
        System.out.println(Hex.encodeHexString(results));
    }
}

3.HmacSHA256算法

实现细节

算法摘要长度备注
HmacMD5128jdk实现
HmacSHA1160
HmacSHA256256
HmacSHA384384
HmacSHA512512
HmacMD2128Bouncy Castle实现
HmacMD4128
HmacSHA224224

分为两步

  1. 构建密钥
  2. 执行消息摘要
public class HmacUtil {
    public static void main(String[] args) throws Exception {
        byte[] result = hmacSHA256(initHmacSHA256Key(), "helloWorld");
        System.out.println(Hex.toHexString(result));
    }

    /**
     * 初始化密钥
     *
     * @return 密钥
     * @throws NoSuchAlgorithmException NoSuchAlgorithmException
     */
    public static byte[] initHmacSHA256Key() throws NoSuchAlgorithmException {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA256");
        SecretKey secretKey = keyGenerator.generateKey();
        return secretKey.getEncoded();
    }

    public static byte[] hmacSHA256(byte[] key, String valueToDigest) throws Exception {
        // 还原密钥
        SecretKeySpec sk = new SecretKeySpec(key, "HmacSHA256");
        Mac mac = Mac.getInstance(sk.getAlgorithm());
        mac.init(sk);
        return mac.doFinal(valueToDigest.getBytes(StandardCharsets.UTF_8));
    }

    public static byte[] initHmacMD5Key() throws NoSuchAlgorithmException {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
        SecretKey secretKey = keyGenerator.generateKey();
        return secretKey.getEncoded();
    }

    private static byte[] hmacMd5(byte[] key, String valueToDigest) throws NoSuchAlgorithmException, InvalidKeyException {
        // 还原密钥
        SecretKeySpec sk = new SecretKeySpec(key, "HmacMD5");
        Mac mac = Mac.getInstance(sk.getAlgorithm());
        mac.init(sk);
        return mac.doFinal(valueToDigest.getBytes(StandardCharsets.UTF_8));
    }

}

总结

消息摘要算法其主要作用是认证消息的完整性。MD5是较为常用的消息摘要算法,不过其已不安全,在安全要求较高的场景不再使用,如网络传输敏感数据。笔者在项目中用的最多的是带有密钥的HmacSHA256算法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值