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日

相关文章

  • 什么是对象的访问?

    对象的访问实际上指的是对对象中属性和方法的访问。在 JavaScript 中,对象是一个由属性名和属性值组成的集合,并且属性值可以包含基本数据类型、函数、甚至是其他对象等。 要访问对象的属性和方法,需要使用点操作符(.)或方括号操作符([])来访问对象属性和方法。其中,点操作符用于访问对象的属性,而方括号操作符可用于使用变量访问属性。 下面是一些常见的对象访…

    Java 2023年5月10日
    00
  • 浅谈Maven包冲突的原理及解决方法

    下面我来详细讲解 “浅谈Maven包冲突的原理及解决方法” 这个话题。首先,我们需要了解一些基础概念。 什么是 Maven? Maven 是一个基于项目对象模型(Project Object Model,POM)的构建工具,可以用来管理项目依赖、构建项目、运行测试等。Maven 使用 jar 归档文件作为项目打包和分发的标准方式,同时支持多模块项目的构建。 …

    Java 2023年6月2日
    00
  • java获取和设置系统变量问题(环境变量)

    Java作为一门跨平台的编程语言,可以轻松获取和修改与操作系统相关的环境变量,可以用来配置系统设置、路径、代理、个性化等,本文将针对Java如何获取和设置系统变量问题,提供完整的攻略。 获取系统变量 Java提供了System类来访问与系统相关的信息,如获取和设置系统变量。 获取系统变量的方法是使用System.getProperty()函数,该函数有多种签…

    Java 2023年5月24日
    00
  • Java 代理(Proxy)的原理及应用

    下面是Java 代理(Proxy)的原理及应用的详细攻略: 什么是Java代理? Java代理是一种为其他对象提供代理服务的模式。代理是一种中介,它在客户端和实际对象之间起到缓冲的作用,使得客户端可以通过代理来访问对象。 Java代理的核心思想是:通过代理来访问实际对象,代理可以实现对实际对象的一些控制和管理,如访问控制、数据验证、安全控制等。 Java代理…

    Java 2023年5月27日
    00
  • IntelliJ IDEA基于SpringBoot如何搭建SSM开发环境的步骤详解

    IntelliJ IDEA基于SpringBoot如何搭建SSM开发环境的步骤详解 1. 环境准备 在开始搭建SSM开发环境之前,我们需要准备以下环境: JDK 1.8或以上版本 IntelliJ IDEA Maven SpringBoot 2. 创建SpringBoot项目 在IntelliJ IDEA中创建一个SpringBoot项目,可以使用Sprin…

    Java 2023年5月18日
    00
  • java字符串中常用的十个方法总结

    Java字符串中常用的十个方法总结 Java字符串是非常常用的一种数据类型,本文将总结Java字符串中常用的十个方法,以帮助初学者更好地掌握Java字符串的使用。 1. charAt(int index) 该方法返回指定索引处的字符,索引从0开始计数。 示例: String str = "Hello, World!"; char firs…

    Java 2023年5月26日
    00
  • SpringBoot 项目瘦身maven/gradle详解

    SpringBoot 项目瘦身 maven/gradle 详解 简介 对于使用 Maven 和 Gradle 构建的 Spring Boot 项目,在打包成 jar 或 war 文件时可能会比较大,占用过多的磁盘空间和运行内存。因此,我们需要对项目进行瘦身,减少不必要的依赖和文件。 本篇文章旨在介绍 Maven 和 Gradle 的瘦身方法,并提供两个示例以…

    Java 2023年6月2日
    00
  • java调用shell命令并获取执行结果的示例

    下面是详细讲解“java调用shell命令并获取执行结果的示例”的完整攻略。 1. Java如何调用Shell命令 在Java中执行Shell命令,可以使用Runtime或ProcessBuilder类。 1.1 使用Runtime类调用Shell命令 String command = "ls -l"; Runtime runtime =…

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