2016-04-14 209 views
0

我從書中讀取SHA-256,但本書並未解釋它的用途。本書解釋瞭如何使用Java創建它。但是,我沒有明白Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1))的用途。有人能詳細解釋一下嗎?什麼是SHA-256?以及如何在Java中創建它?

enter image description here

+1

https://en.wikipedia.org/wiki/Cryptographic_hash_function#Applications –

+0

SHA-256與將數字轉換爲十六進制無關。 –

+1

SHA 256是一種哈希算法。但是,嚴肅地說:如果你不知道這是什麼意思,忘記使用它。通常情況下,您需要哈希和密碼以達到某種「安全性」級別。但這不是初學者的話題。換句話說:就這些問題詢問這些問題意味着你最好留意其他要研究的主題。 – GhostCat

回答

0
Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)) 

是一個WA y將字節值轉換爲非常寬的字符串,顯示字節的十六進制值。看看String's Javadoc page將有所幫助。

0x100substring(1)的組合確保字節值<小於十六進制數(也就是說,十六進制中的0到F)也表示爲兩個字符。

順便說一句:

String.format("%02x",byteData[i]) 

不完全一樣,並且可能被認爲更具可讀性,尤其是通過誰是用來C的printf風格的格式字符串的人。

最後,爲什麼(byteData[i] & 0xff)?有關詳細說明,請參見here

它的工作原理,因爲Java將執行擴大轉換爲int,使用 符號擴展,所以不是一個消極的字節,你將有一個負 INT。用0xff掩碼將只留下較低的8位,從而使 的數字再次爲正數(以及您最初的計劃)。

+0

你能舉一個字節轉換爲十六進制的例子嗎? –

+0

這正是'Integer.toString'和我的'String.format'建議所做的,所以我不明白你的問題? – fvu

+0

現在我明白如何將其轉換爲十六進制,但我還有一個問題。是&0xff重要嗎?不總是等於8位?那麼爲什麼我們需要確保它是8位?謝謝! –

0

SHA-256被稱爲散列算法,其目的是簡單的:它需要的任何數據,併產生一個唯一的系列字節來表示它的。沒有辦法扭轉這個過程,並且沒有已知的SHA-256哈希實例是不唯一的。

所討論的代碼行的目的是生成最終SHA-256輸出的一個字符。 Java爲您提供原始數據(一個字節數組),我們通常將其轉換爲十六進制來表示它爲一個字符串。該代碼行非常複雜,所以我將分別介紹每個部分的作用。

sb.append();正在進行輸入並將其添加到存儲在StringBuilder中的結果中。

Integer.toString();注意到一個數,表示它作爲文字串

byteData[i] & 0xff選擇散列數據的當前字節,並且使用按位與運算用0xff的(所以在字節的每個比特,如果在0xff的對應的位是相同的,輸出是1,如果不輸出是0。

string.substring(1);輸出字符串的第一個字符之後開始。

+0

你的答案也很好,但你沒有解釋「0x100」是什麼。我感謝您的幫助。 –

相關問題