散列内容,然后转换为十六进制结果



我有一个字符串:

String message = "{"name":"三菱グループ"}n"

我想对此消息执行的操作:

  1. 使用SHA-256算法对消息进行哈希
  2. 将步骤1中的哈希转换为小写十六进制字符串

我的应用程序生成

25335a59763ad40ae13d1d4a011efcdc2aa2c4885295aebeb393bc96bb927f66

有人得到不同的结果吗?我我一直在挠头,因为一个远程服务器坚持认为正确的结果是

20de051e351ebc53c83902a72ac916e5a46228fc3e5ec070bf441612e20164d9

我的假设是,只要消息保持不变,无论对同一消息执行多少次这两个链式操作,这些操作的结果都将始终相同。如果不是这样,请告诉我。

我正在添加另一条测试消息(删除换行符):对于

String message = "{"name":"三菱グループ"}";

我的代码生成

7902fb68f1f90f700788613e7f667968beb4abd724abb545e00e01d65e74a772

远程服务器生成

d3df5e50703eb5ff2fd17210af93b6b2ef1e5640c89787405352998d955a4e63

感谢

这在很大程度上取决于如何将其传递到远程服务器。例如,有些服务器在GET请求中无法正确解码亚洲字符。其他服务器将修剪输入的数据。如果没有更多关于如何将其传递到远程服务器的信息,可能很难找到答案。

我尝试将您的字符串传递给在线SHA256计算器,并获得了与您的应用程序产生的输出相同的输出,包括换行和不换行。

只要消息中不包含任何非拉丁字符,我和服务器之间的计算结果将始终相同。

由于SHA256算法是在一个字节序列上操作的,因此您的程序还需要一个步骤:它将String转换为一个字节数组,即类似于以下的内容:

text.getBytes(StandardCharsets.UTF_8)

如果服务器使用的编码不同于UTF-8或您使用的任何编码,则此转换的结果将有所不同。

当您发送一个只有拉丁字符的字符串时,所有字符都将被编码为一个字节,没有任何区别。

String message = "{"name":"三菱グループ"}";
String sha256hex = org.apache.commons.codec.digest.DigestUtils.sha256Hex(message);
System.out.println("hash: " + sha256hex);

结果:哈希:7902fb68f1f90f700788613e7f667968eb4abd724abb545e00e01d65e74a772

你知道远程服务器是否会使用bash脚本吗?在这种情况下,你是否需要在消息中添加另一个"\"。所以它变成了"{\\"名称\\":\\"三菱グループ\\"}";

最新更新