SHA-256哈希返回不同的结果

bit*_*our 0 java

我们需要使用SHA-256来散列字符串.

这是我的代码:

public String getSHA256HashedString(String clearString) {
    String _LOC = "[SB_UtilityBean: getSHA256HashedString]";

    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(clearString.getBytes());

        String _encrypted = bytesToHex(md.digest());
        System.out.println(_LOC + "1.0 " + " Result 1: " + _encrypted);
        System.out.println(_LOC + "1.0 " + " Result 2: " + bytesToHex(md.digest()));

        return _encrypted;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
}

private static String bytesToHex(byte[] bytes) {
    String _LOC = "[SB_UtilityBean: bytesToHex]";

    StringBuffer result = new StringBuffer();
    for (byte byt : bytes) result.append(Integer.toString((byt & 0xff) + 0x100, 16).substring(1));

    return result.toString();
}
Run Code Online (Sandbox Code Playgroud)

如果bytesToHex(md.digest())分配给变量_encrypted并执行打印行_encrypted,我得到结果1:

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

如果我打印一行bytesToHex(md.digest()),我得到结果2:

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

And*_*ico 6

这是预料之中的.该文件说,(重点煤矿):

public byte[] digest()

通过执行填充等最终操作来完成哈希计算.在进行此调用后,将重置摘要.

digest()因此,您的第二次调用是获取无字节的散列,而不是输入字符串.您必须再次输入字符串,或使用存储的结果.

  • @bittersour是的.第二个散列(`e3b ... 855`)是空缓冲区的SHA256和. (2认同)