【问题标题】:Java and JavaScript same sha256 hexJava 和 JavaScript 相同的 sha256 十六进制
【发布时间】:2017-08-02 21:46:39
【问题描述】:

要获取 Java SHA256 哈希,我使用以下方法:

public String getSha256(String text, String encoding){
    String sha = "";
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");

        md.update(text.getBytes(encoding));
        byte[] digest = md.digest();
        sha = new String(digest);
        sha = sha.replace("\n", "");
    } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
        Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
    }
    return sha;
}

像这样:

String testValue = getSha256("test", "UTF-8");

然后要从中获取 HEX 值,我执行以下操作:

public String getHexFromString(String text){
    String hex = "";
    try {
        byte[] myBytes = text.getBytes("UTF-8");
        hex = DatatypeConverter.printHexBinary(myBytes);
    } catch (UnsupportedEncodingException ex) {
        Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
    }
    return hex;
}

System.out.print(getHexFromString(testValue));

这样的结果是:

C5B8E280A0C390EFBFBDCB864C7D65C5A12FC3AAC2A0C3855AC39015C2A3C2BF4F1B2B0BE2809A2CC3915D6C15C2B0C3B008

在 javascript 中,我执行以下操作(使用 this 库):

var hash = sjcl.hash.sha256.hash("test");
console.log(sjcl.codec.hex.fromBits(hash));

结果是:

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

如何在 Java 和 Javascript 中获得相同的十六进制?

我做错了什么,是Java还是Javascript代码?

【问题讨论】:

  • sha = new String(digest); - 不要这样做。摘要是任意二进制数据。您应该将digest 转换为十六进制,而不是将其转换为字符串然后调用您的getHexFromString 代码。这几乎肯定是问题的部分
  • @JonSkeet 谢谢,这解决了这个问题 :) ... 也感谢你很久以前回答我的其他问题,不知何故你是在正确的地方正确的人,我记得 :P

标签: javascript java hash hex sha256


【解决方案1】:

@JonSkeet 是对的,改变了方法,现在看起来像这样:

public String getSha256Hex(String text, String encoding){
    String shaHex = "";
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");

        md.update(text.getBytes(encoding));
        byte[] digest = md.digest();

        shaHex = DatatypeConverter.printHexBinary(digest);
    } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
        Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
    }
    return shaHex;
}

结果是:

9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08

唯一的区别是Java十六进制是大写的,但这是一个小问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2016-01-05
    • 2023-03-18
    • 1970-01-01
    • 2017-05-29
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多