Java加密 消息摘要算法SHA实现详解

Java 加密之消息摘要算法SHA256 实现详解

在这篇文章中,我们将详细介绍使用 SHA256 算法实现消息摘要的 Java 编程。本文将介绍什么是消息摘要算法、SHA256 算法的原理和用法,以及如何在 Java 中使用 SHA256 实现消息摘要。本文还提供了两个示例来演示如何使用 SHA256 算法。

什么是消息摘要算法?

消息摘要算法是简单的单向哈希函数。它将数据流(比如消息)作为输入,生成固定长度的输出。输出通常称为消息摘要或哈希值。与加密算法不同,哈希算法生成的哈希值不能被解密。这使得哈希算法在许多安全应用中变得非常有用。例如,我们可以使用哈希算法来验证密码或检测文件的完整性。

消息摘要算法有许多不同的类型。其中,SHA(安全哈希算法)是最广泛使用的哈希算法之一。SHA 算法的一个常见变体是 SHA256 算法。

SHA 算法的原理和用法

SHA256 算法(Secure Hash Algorithm 256)是一种经典且非常安全的哈希算法。其中,SHA256 算法将消息作为输入,并输出一个固定长度为 256 位的消息摘要或哈希值。SHA256 摘要的大小是固定的,无论输入有多长,输出一定是 256 位。

SHA256 算法的使用非常广泛,特别是在密码存储和验证中。比如常见的字符串哈希存储就是通过 SHA256 算法实现的。

在 Java 中,使用 SHA256 算法实现消息摘要非常简单。Java 提供了一个名为 java.security.MessageDigest 的类,该类可以用于执行一些列哈希操作,其中包括 SHA256 消息摘要。

在 Java 中使用 SHA256 算法实现消息摘要

使用 Java 中的 SHA256 算法,我们可以实现一个快速、灵活和易于实现的哈希函数。以下是在 Java 中使用 SHA256 算法实现消息摘要的步骤。

步骤1:创建 MessageDigest 对象

为了使用 SHA256 算法创建消息摘要,我们需要将输入数据加载到一个 java.security.MessageDigest 对象中。这个对象将执行 SHA256 算法并输出 256 位的哈希值。以下是创建 MessageDigest 对象的 Java 代码:

MessageDigest digest = MessageDigest.getInstance("SHA-256");

在这里,我们调用了 getInstance() 方法,该方法返回一个 SHA-256 消息摘要对象。getInstance() 方法是一个静态方法,它接受哈希算法的名称作为输入。

步骤2:将数据载入到 MessageDigest 对象中

我们需要将要进行哈希运算的字节数组载入到 MessageDigest 对象中。我们可以使用 digest.update() 方法执行此操作。例如:

String input = "Hello World";
byte[] inputBytes = input.getBytes();
digest.update(inputBytes);

为了摘要多块数据,我们可以多次调用 update() 方法,然后调用 digest() 方法生成最终的摘要。

步骤3:生成消息摘要

我们可以通过调用 digest() 方法来生成 SHA-256 消息摘要。

byte[] outputBytes = digest.digest();

在这里,digest() 方法将计算对更新后的输入数据执行哈希计算并返回摘要的字节数组。

以下是一个完整的示例,在这个示例中我们将对字符串 "Hello World" 执行 SHA-256 哈希计算:

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

public class Sha256Test {

  public static void main(String[] args) throws NoSuchAlgorithmException {

    String input = "Hello World";
    byte[] inputBytes = input.getBytes();

    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    digest.update(inputBytes);

    byte[] outputBytes = digest.digest();

    // Convert byte array into signum representation
    java.math.BigInteger bigInteger = new java.math.BigInteger(1, outputBytes);

    //show the hash code
    System.out.println("HashCode of Hello World using SHA-256: " + bigInteger.toString(16));
  }
}

在这里,我们调用了 MessageDigest 类的 getInstance() 方法,该方法返回一个 MessageDigest 对象,它使用 SHA-256 哈希算法。String.getBytes() 方法将字符串转换为字节数组,该字节数组将用于对数据进行摘要。update() 方法将字节数组添加到 MessageDigest 对象中,而 digest() 方法将计算摘要并返回哈希值的字节数组。

执行这个示例,将得到以下哈希值输出:

HashCode of Hello World using SHA-256: 7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069

示例1:在 Java 中使用 SHA256 消息摘要实现密码哈希

SHA256 消息摘要可以用于实现密码哈希。以下是一个示例,展示了如何在 Java 中使用 SHA256 消息摘要算法实现密码哈希:

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

public class PasswordHash {

  public static void main(String[] args) throws NoSuchAlgorithmException {

    String password = "mypassword123"; // 要哈希的密码

    // 创建 MessageDigest 实例,使用 SHA-256 算法进行哈希
    MessageDigest md = MessageDigest.getInstance("SHA-256");

    // 按字节更新 MessageDigest 对象
    md.update(password.getBytes());

    // 获取哈希执行后的字节数组
    byte[] hashedPasswordBytes = md.digest();

    // 将字节数组转换成十六进制字符串
    StringBuilder sb = new StringBuilder();
    for (byte b : hashedPasswordBytes) {
        sb.append(String.format("%02x", b));
    }
    String hashedPassword = sb.toString();

    //展示哈希值
    System.out.println(hashedPassword);
  }
}

这将得到以下输出:

927dfc2bb543d3bec101be514bbd002e808f551ef1c78e17a9f3337cfdb545e2

示例2:在 Java 中使用 SHA256 消息摘要实现文件哈希

另一个常见的用例是使用 SHA256 算法对文件进行哈希。以下是一个示例,展示了如何在 Java 中使用 SHA256 消息摘要算法对文件进行哈希:

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.MessageDigest;

public class FileHash {
  public static void main(String[] args) throws Exception {
    File file = new File("example.txt");
    InputStream is = new FileInputStream(file);

    MessageDigest md = MessageDigest.getInstance("SHA-256");

    byte[] buffer = new byte[1024];
    int n;

    while ((n = is.read(buffer)) != -1) {
      md.update(buffer, 0, n);
    }

    is.close();

    byte[] fileHashBytes = md.digest();

    // Convert byte array into signum representation
    java.math.BigInteger bigInteger = new java.math.BigInteger(1, fileHashBytes);

    //show the hash code
    System.out.println("HashCode of " + file.getName() + ": " + bigInteger.toString(16));
  }
}

在这个示例中,我们使用 FileInputStream 从文件中读取数据。我们按块读取数据,并使用 update() 方法向 MessageDigest 对象中添加数据。然后我们调用 digest() 方法,从 MessageDigest 对象中获取生成的哈希值。最后,我们将哈希值输出到控制台。

总结

在这篇文章中,我们介绍了什么是 SHA256 算法和消息摘要算法。我们还讨论了如何在 Java 中使用 SHA256 算法实现消息摘要,并提供了两个示例来演示其用法。现在,你应该已经了解更多有关哈希算法和如何在 Java 中使用 SHA256 算法实现消息摘要的知识了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java加密 消息摘要算法SHA实现详解 - Python技术站

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

相关文章

  • SpringBoot项目中的多数据源支持的方法

    为在Spring Boot项目中实现多数据源支持,有几种方法可供选择。以下是几种最常用的方法。 方法一:使用Spring Boot提供的自动配置 Spring Boot自动配置对于多个数据源配置非常方便。可以使用@ConfigurationProperties注释来定义不同的数据源。以下是实现多个数据源的示例: # application.yml sprin…

    Java 2023年5月20日
    00
  • RestTemplate添加HTTPS证书全过程解析

    首先我们来介绍一下RestTemplate,它是Spring Framework的一个类,可以简化HTTP客户端的编程工作。通俗地说,它可以让我们轻松使用Java代码发送HTTP请求,接收响应等操作。但是如果要使用HTTPS协议,则需要添加证书。下面就为大家详细介绍一下添加HTTPS证书的全过程。 第一步:获取证书文件 首先,我们需要获取HTTPS证书的文件…

    Java 2023年5月19日
    00
  • spring之Bean的生命周期详解

    Spring之Bean的生命周期详解 在Spring的IoC容器中,Bean的生命周期可以分为多个阶段。接下来,我们将从创建Bean实例,初始化Bean,调用Bean的方法,销毁Bean等阶段,详细讲解Bean的生命周期。 Bean的创建 在容器初始化时,IoC容器会先读取配置文件中的Bean定义,并将Bean的实例化交给BeanFactoryPostPro…

    Java 2023年5月31日
    00
  • 微信小程序实现拍照打卡功能

    这里给出一个基于微信小程序的拍照打卡功能的完整攻略。 实现思路 我们需要使用微信小程序自带的组件camera和canvas,将camera拍摄的内容放在一个canvas中,然后执行保存操作。保存完成后,我们可以通过wx.getFileSystemManager()接口获取保存的照片,再将其上传到服务器,最后完成打卡操作。 具体流程如下: 使用wx.getSe…

    Java 2023年5月23日
    00
  • Java 超详细讲解核心类Spring JdbcTemplate

    Java 超详细讲解核心类 Spring JdbcTemplate 什么是 Spring JdbcTemplate? Spring JdbcTemplate 是 Spring Framework 的一个核心类,它是用于简化 JDBC 开发的一种方式。使用 Spring JdbcTemplate,我们可以不需要编写冗余的 JDBC 代码,而是通过简洁的 API…

    Java 2023年6月2日
    00
  • 建议你使用LocalDateTime而不是Date哦

    当你需要在Java应用程序中使用日期和时间时,Java提供了两个主要的类:Date和LocalDateTime。但是,在开发中,建议使用LocalDateTime而不是Date,因为LocalDateTime提供了更好的灵活性和可读性。 为什么建议使用LocalDateTime? Date类在Java中存在了很长时间,不过它存在一些问题,包括: Date类的…

    Java 2023年5月20日
    00
  • Java Apache Commons报错“PropertyAccessException”的原因与解决方法

    “PropertyAccessException”是Java的Apache Commons类库中的一个异常,通常由以下原因之一引起: 属性访问错误:如果尝试访问属性时出现错误,则可能会出现此异常。可能会尝试访问未定义的属性或尝试访问未正确配置的属性。 以下是两个实例: 例1 如果尝试访问属性时出现错误,则可以尝试使用正确的属性以解决此问题。例如,在Java中…

    Java 2023年5月5日
    00
  • Java中获取时间戳的三种方式对比实现

    Java中获取时间戳的三种方式对比实现 时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总秒数,它在计算机领域中有着广泛的应用场景,比如记录用户的登录时间、订单生成时间等等。在Java中,获取时间戳有三种方式,包括: 1.使用System类的currentTimeMillis()方法2.使用Date类的getTime()方法3.使用I…

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