如何用MessageDigest实现变量MD5与SHA加密校验

来源:微信开发网作者:香港程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《如何用MessageDigest实现变量MD5与SHA加密校验》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用MessageDigest实现变量MD5与SHA加密校验》有用,将其分享出去将是对创作者最好的鼓励。

在Java开发中,MessageDigest是java.security包下提供的用于实现哈希算法的核心类,能够便捷地实现MD5、SHA-1、SHA-256等多种哈希算法的加密校验,常用于数据完整性验证、密码存储等场景。通过该类处理变量加密时,只需要按照固定步骤调用对应方法即可完成计算。

如何用MessageDigest实现变量MD5与SHA加密校验

MessageDigest核心使用步骤

使用MessageDigest实现变量加密校验的整体流程可以分为四步,所有哈希算法的实现都遵循该逻辑:

  • 获取指定算法的MessageDigest实例,算法名称需要准确传入,比如MD5、SHA-1、SHA-256
  • 调用update方法传入需要加密的变量字节数组,支持多次调用update拼接数据
  • 调用digest方法执行哈希计算,得到加密后的字节数组结果
  • 将字节数组转换为十六进制字符串,方便存储和比对校验

MD5加密校验实现示例

MD5算法生成的哈希值长度为128位,通常以32位十六进制字符串展示,以下是完整的变量MD5加密校验代码:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {
    /**
     * 将字节数组转换为十六进制字符串
     * @param bytes 哈希计算后的字节数组
     * @return 十六进制字符串
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexStr = new StringBuilder();
        for (byte b : bytes) {
            // 将字节转换为无符号整数,再转为十六进制
            String hex = Integer.toHexString(b & 0xff);
            if (hex.length() == 1) {
                hexStr.append("0");
            }
            hexStr.append(hex);
        }
        return hexStr.toString();
    }

    /**
     * 计算字符串的MD5哈希值
     * @param input 需要加密的变量
     * @return MD5哈希字符串
     */
    public static String getMD5(String input) {
        try {
            // 获取MD5算法的MessageDigest实例
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 传入变量的字节数组,注意指定字符编码避免乱码
            md.update(input.getBytes("UTF-8"));
            // 执行哈希计算
            byte[] digestBytes = md.digest();
            // 转换为十六进制字符串返回
            return bytesToHex(digestBytes);
        } catch (NoSuchAlgorithmException e) {
            // MD5是Java内置支持的算法,该异常一般不会触发
            throw new RuntimeException("不支持MD5算法", e);
        } catch (Exception e) {
            throw new RuntimeException("MD5计算失败", e);
        }
    }

    public static void main(String[] args) {
        String testVar = "testMessageDigest123";
        String md5Result = getMD5(testVar);
        System.out.println("原始变量:" + testVar);
        System.out.println("MD5加密结果:" + md5Result);
        // 校验逻辑:再次计算相同变量的MD5,比对结果是否一致
        String checkResult = getMD5(testVar);
        if (md5Result.equals(checkResult)) {
            System.out.println("MD5校验通过,数据完整");
        } else {
            System.out.println("MD5校验失败,数据被篡改");
        }
    }
}

SHA系列加密校验实现示例

SHA系列算法包含SHA-1、SHA-256、SHA-512等,哈希值长度更长,安全性高于MD5,以下是SHA-256的实现示例,其他SHA算法的实现只需要修改算法名称即可:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHAUtil {
    /**
     * 字节数组转十六进制字符串,和MD5示例中的方法逻辑一致
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexStr = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(b & 0xff);
            if (hex.length() == 1) {
                hexStr.append("0");
            }
            hexStr.append(hex);
        }
        return hexStr.toString();
    }

    /**
     * 计算字符串的SHA-256哈希值
     * @param input 需要加密的变量
     * @return SHA-256哈希字符串
     */
    public static String getSHA256(String input) {
        try {
            // 获取SHA-256算法的MessageDigest实例,若要使用SHA-1则传入"SHA-1"
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(input.getBytes("UTF-8"));
            byte[] digestBytes = md.digest();
            return bytesToHex(digestBytes);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("不支持SHA-256算法", e);
        } catch (Exception e) {
            throw new RuntimeException("SHA-256计算失败", e);
        }
    }

    public static void main(String[] args) {
        String testVar = "testMessageDigest123";
        String sha256Result = getSHA256(testVar);
        System.out.println("原始变量:" + testVar);
        System.out.println("SHA-256加密结果:" + sha256Result);
        // 校验逻辑
        String checkResult = getSHA256(testVar);
        if (sha256Result.equals(checkResult)) {
            System.out.println("SHA-256校验通过,数据完整");
        } else {
            System.out.println("SHA-256校验失败,数据被篡改");
        }
    }
}

两种算法的特点与注意事项

MD5和SHA算法都属于哈希算法,具有不可逆性,即无法通过哈希结果反推原始变量内容,但二者在安全性和适用场景上有明显区别:

算法类型哈希长度安全性适用场景
MD5128位较低,已被证明存在碰撞漏洞非敏感数据的完整性校验,比如文件下载校验、临时数据标识
SHA-256256位较高,目前暂无公开的有效碰撞攻击方法敏感数据校验、密码存储、数字签名等安全场景

使用MessageDigest时需要注意,传入变量的字节数组时必须统一字符编码,否则不同环境下计算出的哈希值会不一致。另外哈希算法只能用于校验数据完整性,不能用于数据加密传输,因为哈希结果是固定长度的,无法还原原始内容。

常见问题说明

很多开发者在实现时会遇到哈希结果不一致的问题,通常有以下两个原因:

  • 字符编码不统一:比如加密时用UTF-8,解密校验时用GBK,会导致字节数组不同,哈希结果自然不同
  • 算法名称拼写错误:MessageDigest.getInstance的参数必须准确,比如SHA-256不能写成sha256,Java是大小写敏感的

如果需要处理大文件或者流式数据的加密校验,可以多次调用update方法分块传入数据,最后调用一次digest方法即可,不需要一次性将全部数据加载到内存中,避免内存溢出问题。

MessageDigestMD5SHA加密校验修改时间:2026-07-14 15:21:36

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。