哈希内容然后转换为十六进制结果

时间:2016-07-29 11:28:52

标签: java hash encoding character-encoding digest

我有一个字符串:

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

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

  1. 使用SHA-256 algo
  2. 散列消息
  3. 将步骤1中的哈希转换为小写十六进制字符串
  4. 我的应用已制作

    25335a59763ad40ae13d1d4a011efcdc2aa2c4885295aebeb393bc96bb927f66
    

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

    20de051e351ebc53c83902a72ac916e5a46228fc3e5ec070bf441612e20164d9
    

    我假设消息长时间保持不变,无论您对同一消息执行这两个链接操作多少次,这些操作的结果将始终相同。如果情况不是这样,请告诉我。

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

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

    我的代码已生成

    7902fb68f1f90f700788613e7f667968beb4abd724abb545e00e01d65e74a772
    

    并生成远程服务器

    d3df5e50703eb5ff2fd17210af93b6b2ef1e5640c89787405352998d955a4e63
    

    由于

3 个答案:

答案 0 :(得分:0)

我尝试将您的字符串传递给online SHA256 calculator,并获得与您的应用产生的输出相同的输出,无论是否有换行符。

  

我和服务器之间的计算结果总是一样的,所以消息不包含任何非拉丁字符。

由于SHA256算法对字节序列进行操作,因此程序还需要执行一个步骤:它将String转换为字节数组,即:

text.getBytes(StandardCharsets.UTF_8)

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

当您发送仅包含拉丁字符的字符串时,所有字符都将被编码为单个字节,并且没有区别。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

结果: 哈希:7902fb68f1f90f700788613e7f667968beb4abd724abb545e00e01d65e74a772

你知道远程服务器是否在任何情况下都使用bash脚本你需要添加另一个" \"给你的消息。所以它变成" {\\" name \\":\\"三菱グループ\\"}&#34 ;;