2016-07-29 202 views
1

我有一個字符串:散列內容,然後轉換爲十六進制結果

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

操作,我想對這個消息進行:

  1. 哈希使用消息SHA-256算法中
  2. 將步驟1中的散列轉換爲小寫十六進制字符串

我的應用程序產生

25335a59763ad40ae13d1d4a011efcdc2aa2c4885295aebeb393bc96bb927f66 

有人得到不同的結果嗎? 我,一直在抓我的頭,因爲遠程服務器堅持正確的結果是

20de051e351ebc53c83902a72ac916e5a46228fc3e5ec070bf441612e20164d9 

我,只要郵件保持不變的假設下,這些操作的結果將始終是相同的,無論你在同一條消息上執行這兩個鏈接操作多少次。如果情況並非如此,請告訴我。

我添加另一測試消息(換行符移除): 用於

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

我的代碼產生

7902fb68f1f90f700788613e7f667968beb4abd724abb545e00e01d65e74a772 

和所產生的遠程服務器

d3df5e50703eb5ff2fd17210af93b6b2ef1e5640c89787405352998d955a4e63 

由於

回答

0

我嘗試將字符串傳遞給online SHA256 calculator,並獲得與應用程序產生的輸出相同的輸出,包括換行和不換行。

我和服務器之間的計算結果總是相同的,只要消息不包含任何非拉丁字符。

由於SHA256算法對字節序列進行操作,有一個步驟程序需要:它String轉換爲字節數組,即是這樣的:

text.getBytes(StandardCharsets.UTF_8) 

如果服務器正在使用與UTF-8不同的編碼或您正在使用的任何其他編碼,此轉換的結果將會不同。

當你發送一個只有拉丁字符的字符串時,所有的字符都會被編碼爲一個字節,並且不會有差異。

+0

這不是一個在線工具,但是這個消息是作爲一個字符串傳輸的。 – musicsquad

+0

又增加了一個例子,這次沒有換行符 – musicsquad

+0

@musicsquad我將'{「name」:「三菱グループ」}'粘貼到在線計算器中,並將結果返回,即'7902fb68f1f90f700788613e7f667968beb4abd724abb545e00e01d65e74a772'。很顯然,服務器不像您的程序那樣以相同的字節序列計算SHA。 – dasblinkenlight

0

這非常依賴於你如何將它傳遞給遠程服務器。例如,某些服務器在GET請求中不能正確解碼亞洲字符。其他服務器將修剪輸入的數據。如果沒有關於如何將其傳遞到遠程服務器的更多信息,可能很難找出答案。

+0

我明白了。但是你得到了和我一樣的結果嗎?有和沒有換行符的例子?謝謝 – musicsquad

+0

我做過了(換行符,顯然沒有換行符,散列值不同,但仍然不一樣)。我相信這可能是解碼亞洲人物時的問題,但沒有看到通信代碼,我不能告訴更多。 –

+0

與沒有換行符的不一樣?如果沒有換行符,你會得到什麼? – musicsquad

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

結果: 哈希:7902fb68f1f90f700788613e7f667968beb4abd724abb545e00e01d65e74a772

你如果使用bash腳本在您需要添加其他「\」你的消息的情況下任何機會遠程服務器知道。所以它變成「{\\」name \\「:\\」三菱グループ\\「}」;

+0

該消息發送時沒有任何反斜槓。反斜槓只在java代碼中(用於字符串文字轉義)。 – musicsquad

+0

在這種情況下,遠程服務器沒有正確計算它。在所有在線工具上,結果與您的結果相同。即http://www.freeformatter.com/sha256-generator.html#ad-output。 – justMe