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日

相关文章

  • Spring 数据库连接池(JDBC)详解

    Spring 数据库连接池(JDBC)详解 什么是数据库连接池 在开发 Web 应用程序时,通常会使用数据库进行数据存储和管理。当客户端通过应用程序访问数据库时,应用程序需要使用 JDBC 连接到数据库并执行查询或更新操作。在实际开发中,频繁地创建和关闭连接非常消耗资源并且会影响应用程序的性能。为此,使用连接池可以提高性能并减少资源消耗。 数据库连接池是管理…

    Java 2023年5月20日
    00
  • 使用Java代码进行因数分解和求最小公倍数的示例

    当我们需要在Java程序中进行因数分解和求最小公倍数的计算时,我们可以选择使用Java自带的Math类中的方法。下面我会分别介绍解题思路和代码实现。 因数分解 对于因数分解,我们可以利用Math类中的sqrt()方法求出目标数的平方根,然后从2开始递增,试图将其除尽,直到除不了为止。具体实现如下: /** * 因数分解 * * @param n 待分解的数 …

    Java 2023年5月19日
    00
  • 详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】

    详解js的延迟对象、跨域、模板引擎、弹出层、AJAX 本文主要介绍 JavaScript 中五个常用的技术点:延迟对象、跨域、模板引擎、弹出层和 AJAX。我们将使用示例来演示这五个技术点的应用。 延迟对象 延迟对象(Deferred Object)是 jQuery 中异步编程的核心概念之一。在 JavaScript 中,通常采用回调函数进行异步编程。而延迟…

    Java 2023年5月19日
    00
  • JAVA.io读写文件方式汇总

    Java.io读写文件方式汇总 在Java编程中,经常需要对文件进行读写操作,这时候就需要使用Java IO类库中提供的读写文件的方法。本文将会综合常用的文件读写方式,详细介绍其用法和适用场景。 1. FileInputStream/FileOutputStream FileInputStream和FileOutputStream是用来读写二进制文件的基本工…

    Java 2023年5月20日
    00
  • Spring Boot 整合持久层之JdbcTemplate

    下面是详细讲解”Spring Boot 整合持久层之 JdbcTemplate” 的完整攻略: JdbcTemplate 简介 JdbcTemplate 是 Spring Framework 提供的一种针对 JDBC 操作的一个简化封装框架,帮助开发者摆脱繁琐的 JDBC 操作代码,提供了一组方法来方便地操作数据库。 JdbcTemplate内部封装了Jdb…

    Java 2023年5月19日
    00
  • JavaScript入门之对象与JSON详解

    JavaScript入门之对象与JSON详解 1. 什么是对象 对象是一种复合值,将很多值(原始类型或另一个对象)集合在一起,可以方便地组织和管理这些值。 2. 对象的创建 2.1 对象字面量创建对象 对象字面量是表示对象的最简洁方式之一,由一堆用逗号隔开的 名/值 对 组成,逗号后面的属性值可以是任意合法的JavaScript表达式。 示例1: let s…

    Java 2023年5月26日
    00
  • java+io+swing实现学生信息管理系统

    Java+IO+Swing实现学生信息管理系统 学生信息管理系统是一款常见的管理工具,它可以帮助学校、老师或管理员轻松地管理学生的信息。本篇攻略将会使用Java语言结合IO和Swing技术来实现学生信息管理系统。 1. 项目搭建 首先打开你喜欢的IDE,选择新建Java项目,并添加Swing库。 然后新建一个Main类,它将作为程序的入口点。接下来,创建一个…

    Java 2023年5月24日
    00
  • Java如何手动创建线程池

    让我详细讲解一下 Java 如何手动创建线程池。 什么是线程池 线程池是一种用于管理线程的方法,它包含了多个线程,可以解决线程频繁创建和删除的问题。在 Java 中,线程池的实现是通过 Executor 框架来完成的。 为什么要手动创建线程池 Java 中提供了许多内置的线程池,如:FixedThreadPool、CachedThreadPool、Sched…

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