Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和JavaScript使用相同的sha256十六进制_Javascript_Java_Hash_Hex_Sha256 - Fatal编程技术网

Java和JavaScript使用相同的sha256十六进制

Java和JavaScript使用相同的sha256十六进制,javascript,java,hash,hex,sha256,Javascript,Java,Hash,Hex,Sha256,要获取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.d

要获取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");
然后,为了从中获取十六进制值,我执行以下操作:

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中,我执行以下操作(使用库):

结果是:

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


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

@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
9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08

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

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