Java 实现 MD5 加密算法

这篇具有很好参考价值的文章主要介绍了Java 实现 MD5 加密算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. MD5 加密算法

1.1 MD5 算法介绍

MD5 消息摘要算法,英文:MD5 Message-Digest Algorithm ,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

MD5 是单向加密不可逆的,也就是常说的非对称加密,常用于用户密码的加密,这样即使密码泄露也不知道对应的明文信息,有效的保护系统和用户的隐私信息。

MD5 算法产生的是一个 128 位的散列值,128 位是指的二进制中的 128 位,具体占 16 字节(每个字节可以表示为 8 位二进制数)。

MD5 加密最终会将 128 位数字转换成十六进制表示,每个字节( 8 位)转成 2 位十六进制数,最终得到 32 个字符,其中每两个字符代表一个十六进制数,因此最终 MD5 加密结果字符长度为 32 位。

1.2 算法加盐

由于 MD5 算法是单向的,不能被反向解析,但是可以通过正向加密后的字典表(Lookup 表和 Rainbow 表)对比的方式进行暴力破解。

对于此种情况可以使用自定义偏移常量(盐值)的方法来降低加密结果被破解的可能。

2. Java 中实现 MD5 加密

2.1 JDK 提供的 MD5 算法

Java 中进行 MD5 加密使用的是 JDk 中的 java.security 包中的 MessageDigest 类,其中的 getInstance() 方法可以根据算法名称获取对应的算法实例。

// 获取 MD5 算法实例对象
MessageDigest md = MessageDigest.getInstance("MD5");

2.2 字符串的 MD5 加密

根据 JDK 提供的算法,可以对任意的字符内容进行 MD5 加密处理,加密处理的流程为:

  1. 获取 MD5 算法实例

  2. 获取需要加密的字符内容对应的的字节信息,可指定编码方式

  3. 对得到的字节信息使用 MD5 算法处理,得到加密后的字节

  4. 将加密后的字节转化为 16 进制字符串

  5. 返回加密后的字符串信息

public static String md5(String data) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] md5 = md.digest(data.getBytes(StandardCharsets.UTF_8));
        
        // 将处理后的字节转成 16 进制,得到最终 32 个字符
        StringBuilder sb = new StringBuilder();
        for (byte b : md5) {            
             sb.append(String.format("%02x", b));
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}
  • MessageDigest 类可以获取 MD5 实例

  • md.digest() 计算字符串内容的摘要,并得到计算后的 hash value

  • StandardCharsets.UTF_8 用来指定计算时使用的编码格式,如果不指定则会使用系统默认编码格式,系统之间不统一会造成中文乱码

  • sb.append(String.format(“%02x”, b)) 用于将字节信息转为十六进制

最后,可以在 main 方法中验证 MD5 算法的有效性

public static void main(String[] args) {
    String password = "testPsd";
    String passwordMd5Str = md5(password);
    System.out.println("加密前: " + password);
    System.out.println("加密后: " + passwordMd5Str);
}

输出结果为

加密前: testPsd
加密后: 52c165118aae94580335f628dc8b202b

2.3 加盐处理

使用盐值可以进一步提升 MD5 加密算法安全性,降低破解风险。

public static String md5(String data) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");

        // 加盐处理,需要将对应的盐记录,用于验证密码
        int randomNum = new SecureRandom().nextInt(1000);
        
        byte[] md5 = md.digest((data + randomNum).getBytes(StandardCharsets.UTF_8));

        StringBuilder sb = new StringBuilder();
        for (byte b : md5) {
            //sb.append(Integer.toHexString(b & 0xff));
            // 字符串格式转成 16 进制
             sb.append(String.format("%02x", b));
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}

2.4 文件的 MD5 值计算

MD5 算法除了用于对字符内容进行加密,还可以用来对文件进行 MD5 校验。

文件进行 MD5 校验即针对每个文件可以计算出一个 MD5 值来作为该文件的唯一编码,如果文件在传输过程中发生了修改,那么最终得到文件的 MD5 值会发生变化。

根据上述 MD5 校验方法可以验证文件的有效性,保证文件在传输过程中不会被篡改。

public static String md5ForFile(String filePath) {
    MessageDigest md = null;
    byte[] fileBytes = new byte[0];

    try {
        md = MessageDigest.getInstance("MD5");
        fileBytes = Files.readAllBytes(Paths.get(filePath));
    }catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }catch (IOException e) {
        e.printStackTrace();
    }

    byte[] md5 = md.digest(fileBytes);
    StringBuilder sb = new StringBuilder();
    for (byte b : md5) {
        sb.append(String.format("%02x", b));
    }
    return sb.toString();
}

在 main 方法中验证 MD5 算法的有效性

public static void main(String[] args) {
    String filePath = "C:\桌面\test.jpg";
    String fileMd5Str = md5ForFile(filePath);
    System.out.println("加密后: " + fileMd5Str);
}

输出结果为文章来源地址https://www.toymoban.com/news/detail-698669.html

加密后: 75f590a718ee6e8f65c0e7bf780a9e79

到了这里,关于Java 实现 MD5 加密算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java和C#md5算法互通

    对应的C#代码如下 注意这里需要自己拼接字符串,比如java代码如下 对应的C#代码如下

    2024年02月07日
    浏览(13)
  • Java使用MD5加盐对密码进行加密处理,附注册和登录加密解密处理

    在开发的时候,有一些敏感信息是不能直接通过明白直接保存到数据库的。最经典的就是密码了。如果直接把密码以明文的形式入库,不仅会泄露用户的隐私,对系统也是极其的不厉,这样做是非常危险的。 那么我们就需要对这些铭文进行加密。 现在市场是加密的方式已经

    2024年02月02日
    浏览(14)
  • C#常用的加密算法之一 MD5

    MD5加密概述,原理及实现 C#常用的加密算法:MD5、Base64、SHA1、SHA256、HmacSHA256、DES、AES、RSA MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要(32位的数字字母混合码)。 不可逆,相同数据的MD5值肯定一样,不同数据的MD5值不一

    2024年02月10日
    浏览(16)
  • C# 实现MD5加密

    日常程序开发中,涉及到敏感数据内容,通常会采取加密处理以保证数据安全,本篇文章讲述了在C#中使用MD5方法加密数据 MD5的全称是message-digest algorithm 5,MD5算法属于hash算法的一类,对消息进行运算,产生一个128位的消息摘要(32位数字字母),并且加密不可逆,相同数据

    2024年02月08日
    浏览(16)
  • MD5加密--Python实现

    MD5消息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。 MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit 字节,通常用一个32位的16进制字符串表示。 MD5加密

    2024年02月11日
    浏览(21)
  • MD5 到底算不算一种加密算法?

    一旦提到加密算法,经常有人会有这样的疑问:MD5 到底算不算一种加密算法呢? 在回答这个问题之前,我们需要先弄清楚两点: 什么是加密算法? 什么是 MD5? 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码为“密文”

    2024年02月09日
    浏览(13)
  • C#集成数据加密算法,包含DES、RSA、Base64、SHA、MD5算法,轻松实现数据加密解密需求

    在需要使用配置文件的工控软件中,往往需要在配置文件和数据库中对一些数据加密,即对一串数据进行加密算法后输出复杂符号和字符的形式,让非相关人员无法识别原有数据,从而对数据或数据库进行相应的保护,这往往也是公司安全部门的基本要求。 网上写加密算法的

    2024年02月03日
    浏览(24)
  • 【Node.js实战】一文带你开发博客项目之安全(sql注入、xss攻击、md5加密算法)

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,也会涉及到服务端 📃 个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀 未来打算: 为中国的工业软件事业效力n年 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2Vue3项目实战 🥝

    2024年02月03日
    浏览(14)
  • RSA、MD5加密解密算法全套解析安装教程

    第一部分介绍加密解密算法, 第二部分介绍我小组成功应用的RSA、MD5两种加密解密算法,以及心得体会。 1、加密解密算法介绍 应用的开发中安全很重要,所以信息加密技术显得尤为重要。我们需要对应用中的多项数据进行加密处理,从而来保证应用上线后的安全性,给用户

    2024年02月09日
    浏览(21)
  • Java工具集 Hex、Hmac算法(MD5、SHA1、SHA256、SHA384、SHA512)、雪花算法SnowflakeId、redis基于Springboot工具类

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 专栏 描述 Java项目实战 介绍Java组件安装、使用;手写框架等 Aws服务器实战 Aws Linux服务器上操作nginx、git、JDK、Vue Jav

    2024年04月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包