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

yizhihongxing

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日

相关文章

  • SpringMVC+Shiro的基本使用及功能介绍

    SpringMVC+Shiro的基本使用及功能介绍 什么是Shiro Shiro是一个强大且易于使用的Java安全框架,它提供了身份验证、授权、加密、会话管理等功能,可以帮助我们快速构建安全的Web应用程序。 SpringMVC集成Shiro SpringMVC集成Shiro可以帮助我们快速构建安全的Web应用程序。以下是SpringMVC集成Shiro的基…

    Java 2023年5月17日
    00
  • Java调试技术的作用是什么?

    Java调试技术是在开发过程中非常重要的一项技能,主要的作用是帮助开发者在程序出现问题时快速定位、排查和解决问题。下面是使用Java调试技术的完整攻略: 1. 开启调试模式 在Java程序中使用调试功能需要开启调试模式,可以通过在命令行中加入以下参数来开启调试模式: java -Xdebug -Xrunjdwp:transport=dt_socket,add…

    Java 2023年5月11日
    00
  • JAVA环境搭建之MyEclipse10+jdk1.8+tomcat8环境搭建详解

    JAVA环境搭建之MyEclipse10+jdk1.8+tomcat8环境搭建详解 本文将为初学者详细讲解如何在Windows操作系统上搭建MyEclipse10+jdk1.8+tomcat8环境,使得能够愉快地进行JAVA程序开发。 1. 准备工作 在进行环境搭建之前,需要确保系统中已经安装好了以下软件: JDK1.8及以上版本 Tomcat8及以上版本 …

    Java 2023年5月19日
    00
  • 基于php缓存的详解

    下面是基于PHP缓存的完整攻略: 什么是PHP缓存? PHP缓存是一种将PHP脚本解释成二进制代码并缓存在内存或者硬盘中,以便下次直接使用缓存结果的机制。由于PHP代码的解析、编译和执行比较耗时,所以使用缓存机制可以大大提高PHP程序的运行效率和响应速度。 常用的PHP缓存方式 1. APC缓存 APC(Alternative PHP Cache)是PHP官…

    Java 2023年6月16日
    00
  • AJAX SpringBoot 前后端数据交互的项目实现

    讲解”AJAX SpringBoot前后端数据交互的项目实现”的步骤及示例: 1. 准备工作 首先,需要搭建好Spring Boot的环境,并在其中添加对thymeleaf和web模块的支持。若需要使用ORM,还需要添加对JPA的支持。 在前端部分,需要准备好HTML、CSS和JS等组件。 2. 建立一个Spring Boot项目 使用Spring Init…

    Java 2023年5月20日
    00
  • java 获取HttpRequest Header的几种方法(必看篇)

    Java 获取HttpRequest Header的几种方法(必看篇) 简介 HttpRequest Header中包含了HTTP请求相关的重要信息,如User-Agent、Content-Type、Accept-Encoding等等。在Java Web开发中,我们可能需要获取Header中的某些信息进行处理,接下来我们就来介绍几种Java获取HttpReq…

    Java 2023年6月15日
    00
  • 基于Spring Data Jest的Elasticsearch数据统计示例

    我来为你详细讲解“基于Spring Data Jest的Elasticsearch数据统计示例”的完整攻略。 一、前言 在讲解具体实现之前,我们需要先了解一些背景知识。Elasticsearch 是目前非常流行的一个开源搜索引擎,具有高速、高伸缩性、分布式、全文搜索、分词等特点,它是基于 Apache Lucene 的实现,使用 Java 开发。Spring…

    Java 2023年5月20日
    00
  • Java消息队列的简单实现代码

    要讲解完整的“Java消息队列的简单实现代码”的攻略,需要分以下几个部分: 简单介绍Java消息队列的概念和作用; 规划Java消息队列代码的流程和所需的库; 根据流程编写代码,包括发送消息、接收消息和处理消息的功能; 编写示例代码来说明Java消息队列的使用方法。 下面将分部分逐一讲解。 简单介绍Java消息队列的概念和作用 Java消息队列,简称MQ,是…

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