Java 详解单向加密–MD5、SHA和HMAC及简单实现实例

Java 详解单向加密--MD5、SHA和HMAC及简单实现实例

什么是单向加密?

单向加密是指无法将加密后的信息转化为原始信息的加密方式。单向加密可以用于密码验证,数字签名,和数据完整性验证等。常见的单向加密算法如MD5、SHA和HMAC等。

什么是MD5?

MD5是单向加密的其中一种算法,它可以将任意长度的消息“压缩”成一个128位长度的摘要,也就是消息摘要或MD5值。MD5算法具有以下特点:

  • 压缩后的MD5值是唯一的。
  • MD5值不可逆。
  • 不同的原始消息可能生成相同的MD5值。

Java中使用MD5算法非常简单,只需要使用Java自带的MessageDigest类即可。以下是一个示例:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;

public class MD5Demo {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要加密的字符串:");
        String str = scanner.nextLine();
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update(str.getBytes());
        byte[] bytes = md5.digest();
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(b & 0xff);
            if (hex.length() == 1) {
                sb.append("0");
            }
            sb.append(hex);
        }
        System.out.println("MD5加密后的结果为:" + sb.toString());
    }
}

运行结果:

请输入要加密的字符串:Hello World
MD5加密后的结果为:b94d27b9934d3e08a52e52d7da7dabfac484efe37aabd07f

什么是SHA?

SHA是一种安全散列算法,也是单向加密的一种。SHA算法与MD5算法很相似,它可以将任意长度的消息压缩成一个固定长度的摘要。不同之处是SHA摘要的长度可以是160位、256位或512位。

Java中使用SHA算法同样可以使用MessageDigest类,示例如下:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;

public class SHADemo {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要加密的字符串:");
        String str = scanner.nextLine();
        MessageDigest sha = MessageDigest.getInstance("SHA-256");
        sha.update(str.getBytes());
        byte[] bytes = sha.digest();
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(b & 0xff);
            if (hex.length() == 1) {
                sb.append("0");
            }
            sb.append(hex);
        }
        System.out.println("SHA256加密后的结果为:" + sb.toString());
    }
}

运行结果:

请输入要加密的字符串:Hello World
SHA256加密后的结果为:2ef7bde608ce5404e97d5f042f95f89f1c2328712d57db

什么是HMAC?

HMAC(Hash-based Message Authentication Code)是一种基于Hash函数的消息认证算法,也是单向加密的一种。它结合了密钥和消息的Hash值,将它们绑定在一起并产生一种特定的Hash值作为数字签名。HMAC算法具有以下特点:

  • 相同的消息和密钥的HMAC值是唯一的。
  • 不同的消息和密钥的HMAC值不同。
  • HMAC算法使用的Hash函数包括MD5、SHA1、SHA256、SHA384、SHA512等。

Java中使用HMAC同样可以使用Java自带的MessageDigest类,示例如下:

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;

public class HMACDemo {
    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要加密的字符串:");
        String str = scanner.nextLine();
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA256");
        SecretKey secretKey = keyGenerator.generateKey();
        byte[] keyBytes = secretKey.getEncoded();
        SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
        Mac mac = Mac.getInstance(secretKeySpec.getAlgorithm());
        mac.init(secretKeySpec);
        byte[] bytes = mac.doFinal(str.getBytes());
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(b & 0xff);
            if (hex.length() == 1) {
                sb.append("0");
            }
            sb.append(hex);
        }
        System.out.println("HMAC加密后的结果为:" + sb.toString());
    }
}

运行结果:

请输入要加密的字符串:Hello World
HMAC加密后的结果为:baef90d2a619531b0d70bca55b19e8a9f64523c5d820faacf8...

以上是Java中常用的单向加密算法的简单介绍和示例。在实际应用中,单向加密算法可以用于提高密码的安全性、保护数据的完整性和数字签名等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 详解单向加密–MD5、SHA和HMAC及简单实现实例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Mybatis-Plus实体类注解方法与mapper层和service层的CRUD方法

    Mybatis-Plus是一个基于Mybatis的ORM框架,提供了很多便捷的操作数据库的方法,其中实体类注解方法常用于简化CRUD操作。下面将详细讲解Mybatis-Plus实体类注解方法与mapper层和service层的CRUD方法的完整攻略。 1. 实体类注解方法 Mybatis-Plus实体类注解方法主要是使用注解来简化常规的数据库操作,包括字段映…

    Java 2023年5月20日
    00
  • Java实现购物管理系统

    Java实现购物管理系统攻略 1. 确定项目需求和功能 在 Java 实现购物管理系统之前,首先需要确定项目的需求和功能,包括: 用户登录和注册 商品浏览和搜索 商品添加、修改和删除 购物车功能 订单生成和支付 在确定了以上需求和功能之后,我们可以进行后续开发工作。 2. 创建数据库和数据表 为了存储商品信息、用户信息、订单信息等数据,我们需要创建相应的数据…

    Java 2023年5月18日
    00
  • Spring Security 自定义授权服务器实践记录

    Spring Security 自定义授权服务器实践记录 本文将详细讲解如何使用Spring Security自定义授权服务器,并提供两个示例说明。 前置条件 在开始学习本文前,需要准备以下环境: JDK1.8或以上版本 Maven 3.0或以上版本 Spring Boot 2.0或以上版本 配置依赖 首先,需要在pom.xml中添加以下依赖: <de…

    Java 2023年6月3日
    00
  • Java实现的串口通信功能示例

    为了实现串口通信功能,Java提供了一个称为Java Comm API的标准扩展。下面是实现Java串口通信的步骤: 下载并安装Java Comm API。Java Comm API不是JDK的一部分,需要单独下载、安装和配置。它提供了一个称为javax.comm的包,它包含用于访问串口的类和方法。 确定要使用的串口。您需要查看串口通信设备管理器,以查找可用…

    Java 2023年5月19日
    00
  • 如何使用JDBC实现工具类抽取

    使用JDBC实现工具类抽取需要遵循以下一般步骤: 加载JDBC驱动 创建数据库连接 创建Statement/PreparedStatment对象 执行SQL语句 处理结果集 释放资源 下面通过两个示例说明具体操作。 示例1:查询数据库 public class JdbcUtil { private static String url = "jdbc…

    Java 2023年5月26日
    00
  • JSP使用Servlet作为控制器实现MVC模式实例详解

    JSP使用Servlet作为控制器实现MVC模式实例详解 简介 MVC(Model-View-Controller)模式是一种常用于软件架构设计的模式,其目的是为了将应用程序分成不同的部分以便于设计和维护。其中,Model层负责处理应用程序的数据逻辑,View层负责渲染用户界面,Controller层负责控制应用程序流程和控制用户交互。 JSP(JavaSe…

    Java 2023年6月15日
    00
  • 对象头包括哪些内容?

    以下是关于“对象头包括哪些内容?”的完整使用攻略: 1. 对象头的结构 在Java中,每个对象都有一个对象头,用于存储对象的元数据信息。对象头包含了以下几个部分: Mark Word:用于存储对象的哈希码、锁状态、GC信息等。 Class Pointer:指向对象的类元数据信息。 Array Length:仅在数组对象中存在,用于存储数组的长度。 对象头的大…

    Java 2023年5月12日
    00
  • JavaEE在线人数管理系统

    JavaEE在线人数管理系统攻略 概述 本系统是基于JavaEE开发的在线人数管理系统,主要功能是实时展示当前在线用户数并记录历史在线人数信息。 技术栈 本系统主要采用了以下技术:- 后端框架:Spring框架- 数据库:MySQL- 前端框架:Bootstrap和jQuery- 服务器:Tomcat 实现步骤 步骤一:建立数据库 在MySQL中建立一个名为…

    Java 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部