2017-07-31 120 views
0

我已經在SO中檢查過類似的問題,但沒有人能回答我的問題,所以在此發佈我的問題。 在我的代碼中進行第三方API調用之前,我需要爲密碼生成原始SHA。 我使用的是存在於apache編解碼庫中的DigestUtils。以下是Java代碼java中的原始SHA1與PHP中的原始SHA1不匹配

public static String sha1 (String input) 
    throws NoSuchAlgorithmException, 
     UnsupportedEncodingException { 

    return new String(DigestUtils.sha(input)); 
} 
// I suppose this gives me raw SHA. 

而且PHP代碼(我在谷歌獲得)如下

$passwordSha = sha1($password, true); 

// The boolean value gives the SHA in binary format. 

對於輸入的 「密碼」,下面是輸出

JAVA : "+��0G���i.)�\�I�_�7" 
PHP : "+��0G���i.)�\�I�_�7" 

我不知道是否比較這些垃圾值是正確的,但是我生成的最終密碼摘要,依賴於上面的代碼在PHP和JAVA中是不同的。 (在PHP中獲得正確的值)。

請幫助我瞭解在生成原始SHA1在PHP和JAVA中的差異。

UPDATE

編輯輸出。我的壞..

一些更針對不同的輸入

輸入的結果: 「secretnonce101112015-09-30T14:12:15Za`t^X」

JAVA: 「S AM; *」

PHP: 「我>рq」

我在java輸出中看到一些額外的字符。不知道這是否毀了我的最終密碼摘要。

+0

將隨機字節轉換爲「String」是非常沒用的。十六進制字符串更具可讀性。但是你的意思是,你從這兩個系統獲得相同的值,所以......? – Kayaman

+0

粘貼輸出時出現了一些問題。更正它。 –

回答

0

我不知道你是否在類型轉換中以某種方式丟失了字符串,但是你可以嘗試下面的內容並比較輸出嗎?這應該表示爲一個十六進制字符串。

public static String sha1 (String input) 
    throws NoSuchAlgorithmException, 
     UnsupportedEncodingException { 

    return DigestUtils.sha1Hex(input); 
} 

VS

$passwordSha = sha1($password, false); 
+0

是的。我爲shaHex()和sha1($ password,false)獲得相同的輸出。基本上十六進制表示法在java和php中給出相同的輸出。我不確定使用原始SHA1時出了什麼問題。是的,第三方API期望我們生成原始SHA,這是怎麼在這 –

+0

然後它必須是類型鑄造,那麼: 返回新的字符串(DigestUtils.sha1(輸入),「US-ASCII」 ); – Doug

+0

JAVA: s A M ; * PHP:>i> рq 仍然不一樣。我無法確定可能出現的問題 –