📜  java sha256 十六进制摘要 - Java (1)

📅  最后修改于: 2023-12-03 14:42:16.093000             🧑  作者: Mango

Java SHA256 十六进制摘要

在Java中,可以使用SHA-256哈希算法生成字符串的摘要(digest)。此外,还可以将结果转换为十六进制格式,方便显示和存储。

1. SHA256摘要生成
1.1 使用Java标准库

Java标准库中提供了MessageDigest类,可以方便地生成SHA-256消息摘要。以下是一个示例代码:

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

public class SHA256Demo {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        String input = "hello world"; // 待计算摘要的字符串
        MessageDigest md = MessageDigest.getInstance("SHA-256"); // 获取SHA-256的MessageDigest实例
        byte[] digest = md.digest(input.getBytes()); // 计算摘要字节数组
    }
}

说明

  • MessageDigest.getInstance("SHA-256") 用于获取SHA-256算法的消息摘要对象;
  • input.getBytes() 将字符串转为字节数组;
  • md.digest(byte[] input) 所有摘要计算都可以使用该方法,参数为待计算摘要的字节数组,返回计算后的摘要字节数组。
1.2 使用第三方库

另外,还可以使用一些开源的Java哈希库,如Bouncy Castle、Apache Commons Codec等。它们提供了更方便的API,使用起来更简洁。

以Bouncy Castle为例,以下是一个示例代码:

import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.util.encoders.Hex;

public class SHA256Demo {
    public static void main(String[] args) {
        String input = "hello world"; // 待计算摘要的字符串
        SHA256Digest md = new SHA256Digest(); // 创建SHA-256的Digest对象
        byte[] data = input.getBytes(); // 将字符串转为字节数组
        md.update(data, 0, data.length); // 输入摘要数据
        byte[] digest = new byte[md.getDigestSize()]; // 创建一个字节数组,用于存放摘要
        md.doFinal(digest, 0); // 计算摘要
        String result = new String(Hex.encode(digest)); // 字节数组转换为十六进制字符串
        System.out.println(result);
    }
}

说明

  • org.bouncycastle.crypto.digests.SHA256Digest 提供了SHA-256哈希算法的实现类;
  • md.update(byte[] in, int inOff, int len) 输入摘要数据;
  • md.doFinal(byte[] out, int outOff) 计算摘要;
  • org.bouncycastle.util.encoders.Hex 提供了字节数组和十六进制字符串相互转换的工具类。
2. 将摘要转换为十六进制字符串

SHA-256摘要通常以字节数组的形式存储。如果要在屏幕上显示或存储摘要,可以将其转换为十六进制字符串。

以下是代码片段:

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA256Demo {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        String input = "hello world"; // 待计算摘要的字符串
        MessageDigest md = MessageDigest.getInstance("SHA-256"); // 获取SHA-256的MessageDigest实例
        byte[] digest = md.digest(input.getBytes()); // 计算摘要字节数组
        String result = new BigInteger(1, digest).toString(16); // 将字节数组转换为十六进制字符串
        System.out.println(result);
    }
}

说明

  • new BigInteger(1, byte[] val) 用指定的字节数组构造一个BigIntger对象,其中1表示正数;
  • BigInteger.toString(int radix) 将数字以指定的进制(此处为16)转换为字符串。