2017-03-12 12 views
1

は、私は次のメソッドを使用するJava SHA256ハッシュを取得するにはJavaとJavaScript同じSHA256の六角

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 

私は(thisライブラリを使用して)次の操作を行い、JavaScriptで:

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

そして結果は次のとおりです。

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 

どのように私はJavaとJavaScriptで同じヘクスを得ることができますか?

私は間違っていますか、それはJavaコードかJavascriptコードですか?

+3

'sha = new String(digest);' - これをしないでください。ダイジェストは任意のバイナリデータです。 'digest'を文字列に変換せずに' getHexFromString'コードを呼び出すのではなく、16進数に変換する必要があります。それは問題のほぼ確実な一部です。 –

+0

@JonSkeetありがとう、これは問題を解決しました:)また、私の他の質問にもっと長い前に答えることに感謝します。何とかあなたは正しい場所にいる正しい人です。 – Alpha2k

答えて

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の六角が大文字であるということです解決しなければならないことはそれほどありません。