Java实现SHA-256加密算法的完全解析

Java实现SHA-256加密算法的完全解析

SHA-256加密算法是目前应用最广泛的加密算法之一,本篇文章介绍如何在Java中实现SHA-256加密算法。

什么是SHA-256加密算法

SHA-256是一种哈希算法,将任意长度的二进制值映射为一个较短的固定长度的二进制值(通常是256位)。SHA-256算法基于SHA-2家族的算法,其中"256"表示哈希值的位数。

SHA-256算法具有以下特点:

  • 不可逆,无法从哈希值反推原始输入;
  • 相同的输入一定会得到相同的输出;
  • 哈希值相同的输入可能不同,但是概率非常小。

SHA-256算法广泛应用于数字签名、数据完整性校验等场景。

如何在Java中实现SHA-256加密算法

Java提供了MessageDigest类来实现SHA-256加密算法,具体步骤如下:

  1. 获取MessageDigest实例:

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

在实例化MessageDigest时需要指定使用的加密算法,这里选择SHA-256算法。

  1. 输入需要加密的数据:

java
byte[] input = "hello, world".getBytes();

将需要加密的数据转换为byte数组。

  1. 执行加密:

java
byte[] output = md.digest(input);

将byte数组输入到MessageDigest的digest()方法中,执行SHA-256加密算法,得到加密后的byte数组output。

完整示例代码如下:

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

public class SHA256Example {

    public static void main(String[] args) throws NoSuchAlgorithmException {
        // 获取MessageDigest实例
        MessageDigest md = MessageDigest.getInstance("SHA-256");

        // 输入需要加密的数据
        byte[] input = "hello, world".getBytes();

        // 执行加密
        byte[] output = md.digest(input);

        // 输出加密后的结果
        System.out.println(Arrays.toString(output));
    }

}

运行结果如下:

[-38, 81, 105, -124, -34, -24, 89, 29, -9, -109, -23, 29, -73, 119, -50, 120, -57, -34, 0, 101, 56, -103, 18, 46, -85, -112, 105, -66, -84, -128, -29, 125]

上面的代码中,获取MessageDigest实例时可能会出现NoSuchAlgorithmException异常,这是因为指定的加密算法不存在,需要进行异常处理。

示例说明

示例一:密码加盐

在密码存储时,为了提高密码的安全性,通常需要将密码加盐再进行哈希。下面是一个示例代码:

public class PasswordExample {

    private static final int SALT_LENGTH = 16;

    public static void main(String[] args) throws NoSuchAlgorithmException {
        // 获取密码和盐
        String password = "123456";
        byte[] salt = generateSalt(SALT_LENGTH);

        // 将密码和盐拼接
        byte[] input = concat(password.getBytes(), salt);

        // 执行加密
        byte[] output = sha256(input);

        // 输出加密后的结果
        System.out.println("password: " + Arrays.toString(output));
        System.out.println("salt: " + Arrays.toString(salt));
    }

    private static byte[] generateSalt(int saltLength) {
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[saltLength];
        random.nextBytes(salt);
        return salt;
    }

    private static byte[] concat(byte[] a, byte[] b) {
        byte[] result = new byte[a.length + b.length];
        System.arraycopy(a, 0, result, 0, a.length);
        System.arraycopy(b,0,result,a.length,b.length);
        return result;
    }

    private static byte[] sha256(byte[] input) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        return md.digest(input);
    }

}

上面的代码中,首先生成一个随机的盐,然后将密码和盐拼接起来,再执行SHA-256加密算法。这样可以在存储密码时提高安全性。

示例二:计算文件哈希值

在下载文件、校验文件完整性等场景中,经常需要计算文件的哈希值。下面是一个示例代码:

public class FileHashExample {

    public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
        // 获取文件路径
        String filePath = "C:\\Users\\Administrator\\Desktop\\test.txt";

        // 读取文件内容
        byte[] input = Files.readAllBytes(Paths.get(filePath));

        // 执行加密
        byte[] output = sha256(input);

        // 输出加密后的结果
        System.out.println(filePath + " hash: " + bytesToHex(output));
    }

    private static byte[] sha256(byte[] input) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        return md.digest(input);
    }

    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X ", b));
        }
        return sb.toString();
    }

}

上面的代码中,首先获取文件路径,然后使用Files工具类读取文件内容,并将文件内容作为输入执行SHA-256加密算法。最后输出加密后的结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现SHA-256加密算法的完全解析 - Python技术站

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

相关文章

  • java可变参数当做数组处理的方法示例

    Java的可变参数可以让我们在定义方法时不确定参数的个数,这些参数被当做数组来处理,能够使方法的调用更加灵活方便。下面将为大家介绍Java可变参数当做数组处理的方法示例,具体步骤如下: 第一步:定义一个接收可变参数的方法 首先,我们需要在Java代码中定义一个接收可变参数的方法。以打印数组中所有元素为例,代码如下: public static void pr…

    Java 2023年5月26日
    00
  • 详解Java编程中统一资源定位符URL的相关使用

    详解Java编程中统一资源定位符(URL)的相关使用 在Java编程中,统一资源定位符(URL)是一个非常重要的概念,它用于表示因特网上的资源地址。在Java中,可以通过URL类来处理URL地址。本文将详细讲解Java编程中URL的相关使用,并给出两个示例来说明。 URL类的概述 URL类是Java中用于处理URL地址的类,其位于java.net包中。对于一…

    Java 2023年6月15日
    00
  • Window搭建部署RocketMQ步骤详解

    下面是详细讲解“Window搭建部署RocketMQ步骤详解”的完整攻略。 Window搭建部署RocketMQ步骤详解 RocketMQ是一个分布式消息传递系统,由阿里巴巴团队开发和维护。在实际开发中,我们经常需要使用消息队列来进行异步通信与解耦。本文将介绍如何在Window平台上搭建和部署RocketMQ。 步骤一:下载和安装JDK RocketMQ是基…

    Java 2023年5月20日
    00
  • java8 集合求差集、并集、交集的实例

    下面是关于“java8 集合求差集、并集、交集的实例”的完整攻略。 1. 集合的概念 在java中,集合就是对象的容器,允许我们将多个对象存储在一起,并提供了不同的方法来操作这些对象。集合又分为List、Set和Map三种,分别用于存储不同类型的数据。 2. 集合的求差集、并集、交集 在java中,我们可以使用Set接口提供的方法来求集合间的差集、并集和交集…

    Java 2023年5月19日
    00
  • java 排序算法之归并排序

    Java 排序算法之归并排序 算法简介 归并排序(Merge Sort)是一种基于分治思想的排序算法,其基本思想是将待排序的序列不断列表分割为子序列,直到每个子序列只有一个元素,然后将子序列两两合并并按照考虑的比较规则合并成一个有序的大序列,直到最后整个序列有序。 归并排序的时间复杂度为O(nlogn),稳定排序,但是需要额外的空间复杂度O(n),因为需要额…

    Java 2023年5月19日
    00
  • ELK收集Tomcat日志的实现

    下面我将为您详细讲解”ELK收集Tomcat日志的实现”。 什么是ELK? ELK是指Elasticsearch、Logstash、Kibana三个开源工具的集合,它们可以协同工作来收集、存储、搜索和可视化各种类型的日志数据。 Elasticsearch:全文搜索引擎,用于快速检索和存储数据。 Logstash:日志收集和转换工具,用于统一日志格式、进行过滤…

    Java 2023年6月2日
    00
  • 什么是扩展类加载器?

    扩展类加载器是Java程序中的一个类加载器,它是Java虚拟机内置的三个类加载器之一。扩展类加载器负责加载Java虚拟机的扩展类库,这些类库一般位于JAVA_HOME/jre/lib/ext目录下。 扩展类加载器的使用攻略包括以下几个步骤: 步骤一:了解扩展类加载器的原理 扩展类加载器是Java虚拟机内置的三个类加载器之一,其主要任务是加载扩展类库。它的工作…

    Java 2023年5月10日
    00
  • Spring Data Jpa 复杂查询方式总结(多表关联及自定义分页)

    下面就是 Spring Data JPA 复杂查询方式的攻略: 概述 Spring Data JPA 提供 JPA 规范标准的数据访问方式,并简化了持久层的开发。在实际应用场景中,有些查询需要多表关联及自定义分页方式。 本文将介绍 Spring Data JPA 多表关联及自定义分页的实现方式。 多表关联查询 基于 JPA 查询 在 JPA 中,我们可以通过…

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