linux 从Java中的字符串列表中生成SHA256十六进制字符串,可以使用sha256sum CLI命令进行检查?

im9ewurl  于 2023-03-17  发布在  Linux
关注(0)|答案(2)|浏览(141)

我有一个List<String>,我希望显示该List<String>内容的SHA-256,然后写入文件。然后我希望控制Java生成的SHA-256和Linux CLI sha256sum file.txt生成的SHA-256。
我首先从List<String> list的序列化开始:

byte[] bytes = org.apache.commons.lang3.SerializationUtils.serialize((Serializable) list);

以及产生执行SHA-256:

public static BiFunction<byte[], String, String> stringDigestFromBytes =
        (h, t) -> Hex.encodeHexString(DigestUtils.getDigest(t).digest(h));

然后,在将list写入文件之前,我生成Java SHA-256:

String hex256 = stringDigestFromBytes.apply(bytes, "SHA-256");

然后将list写入文件:

Files.write(Path.of("file.txt"), list);

但是Java的SHA-256和Linux CLI sha256sum file.txt生成的SHA-256并不匹配。有什么想法可以让两个SHA-256完全相同吗?

50pmv0ei

50pmv0ei1#

如果您已经在使用Apache DigestUtils类,请用途:

String hex256 = new DigestUtils(MessageDigestAlgorithms.SHA_256)
    .digestAsHex(bytes);
bzzcjhmw

bzzcjhmw2#

下面的代码生成的哈希值与sha256sum对包含相同字符串的文本文件所做的哈希值相同:

import java.util.List;
import java.util.HexFormat;
import java.util.stream.Collectors;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class Hash256 {
    public static void main(String[] args) {
        try {
            List<String> strings = List.of("alpha", "beta", "gamma");
            final String SEP = "\n";
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            String originalString = strings.stream()
                .collect(Collectors.joining(SEP));
            originalString += SEP;
            byte[] encodedHash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
            System.out.println(HexFormat.of().formatHex(encodedHash));
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

相关问题