2012-12-10 168 views
2

我一直在盲目地遵循OWASP關於java中的散列生成的建議(see here),並且我不確定我是否做得正確。具體而言,我不確定MessageDigest.reset()的目的和效果,因此何時以及如何使用它。什麼時候使用MessageDigest.reset()

  1. 我正在通過update()「載入」我的鹽和有效載荷多次使用不同的值,總共需要簽名。我應該事先摘錄reset()嗎?或之後?
  2. 爲什麼摘要在循環中爲reset()(請參閱示例)?

這裏是我的代碼:

MessageDigest md = MessageDigest.getInstance("SHA-256"); 
md.update(salt); 
md.update(payload1); // part 1 of payload 
md.update(payload2); // part 2 of payload 
md.update(serialNumber); // part 3 of payload 
md.reset(); 
byte[] sig = md.digest(); 
for (int i=0; i<1000; i++) { 
    md.reset(); 
    sig = md.digest(sig); 
} 

我正在觀察的是,簽名保持不變,即使serialNumber正在發生變化。如果我忽略'reset()'調用,sig會改變...

+0

可能重複[在使用它之前是否需要調用MessageDigest.reset()?](http://stackoverflow.com/questions/7546549/do-i-need-to-call-messagedigest-reset-before -using-it) – durron597

回答

5

如果您已經使用MessageDigest的實例,則只需致電reset即可。在此調用reset以清除以前的所有設置。

MessageDigest.getInstancefactory method而不是singleton所以有附加的重大開銷。

MessageDigest.getInstance

MessageDigest對象封裝來自返回支持指定算法的Provider MessageDigestSpi實現。

因此重新使用並避免再次調用MessageDigest.getInstance的開銷會更好。

+0

所以OWASP的例子和我的代碼都是錯的,是嗎?如果我總是得到一個新的實例,我根本不需要'重置'? – Hank

+0

我會去重置和重新使用:) – Reimeus

+0

@Hank - 你並不總是得到一個新的實例,因爲'.getInstance'在循環之外。在這裏使用'.reset'很好。 – webnoob

5

代碼在我看來......也許我錯在這裏讀,但docsdigest()隱式重置實例。因此,如果您有以下情況,請致電reset():1)以前稱爲update(); 2)需要重新使用實例,但不需要update()調用的結果。

在你的情況下,我也認爲你需要忽略第一個電話reset()。否則,你會從鹽和有效載荷中剔除任何好處。循環內對reset()的呼叫是不必要的,但不應改變計算結果。

希望有所幫助。

+0

完全同意,最初的代碼*是在首先執行reset()調用時關閉的。感謝關於隱式重置的指針! – Hank

相關問題