2011-09-25 57 views
5

問題很簡單:何時應該在java類MessageDigest上調用reset()函數?在使用它之前是否需要調用MessageDigest.reset()?

的問題主要來自OWASP reference,其中的代碼示例中,他們這樣做:

MessageDigest digest = MessageDigest.getInstance("SHA-1"); 
    digest.reset(); 
    digest.update(salt); 
    byte[] input = digest.digest(password.getBytes("UTF-8")); 

然後,在一個循環中,他們這樣做:現在

for (int i = 0; i < iterationNb; i++) { 
     digest.reset(); 
     input = digest.digest(input); 
    } 

,對我來說,看起來好像僅當摘要實例已被調用更新的「污染」時才需要重置。因此,第一個樣品中的那個似乎不是必需的。如果有必要,是否表示由MessageDigest.getInstance返回的實例不是線程安全的?

回答

4

,我認爲你是對的,最初的reset()是沒有必要的。 documentation states

MessageDigest對象開始初始化。

此外類文檔上的示例不包括初始重置。

這與線程安全無關,.reset()的必要性只會表明getInstance()本身不會執行初始化。

不應該在多個線程中使用同一個MessageDigest對象,而無需同步:只有當您知道部件被散列的順序時,散列纔有意義,否則它只是一個看似不完全確定的PRNG。

+0

TY,有道理。在google的參考文獻中看到這麼多,忘了重新讀取類頭和getInstance()doc,所以我最終感到困惑。 –

相關問題