我在使用wildfly 8.2和Java 1.7的生產環境中遇到了一個真正好奇的情況。使用java摘要的哈希生成時間變得更慢
這種情況是,當服務器啓動超過2周時,登錄開始降低性能。我一直在尋找可能表明問題出在哪裏的線索。然後在做了一些測試之後,我得出結論,問題是,以純文本插入的密碼被加密以與已經插入的密碼進行比較。
執行加密密碼的功能需要將近2分鐘,但是當服務器重新啓動時,相同的執行時間少於30秒。
加密使用java.security.MessageDigest生成散列。特別使用SHA-256和50000次迭代。任何想法爲什麼這個過程會隨着時間變慢?我使用/ dev/urandom生成隨機數,所以不應該成爲問題。
這裏是funtion代碼:
protected byte[] hash(byte[] bytes, byte[] salt, int hashIterations) throws UnknownAlgorithmException {
MessageDigest digest = getDigest(getAlgorithmName());
if (salt != null) {
digest.reset();
digest.update(salt);
}
byte[] hashed = digest.digest(bytes);
int iterations = hashIterations - 1; //already hashed once above
//iterate remaining number:
for (int i = 0; i < iterations; i++) {
digest.reset();
hashed = digest.digest(hashed);
}
return hashed;
}
你100%肯定完全顯示代碼塊是罪魁禍首?不是周圍或內部的東西,例如'getDigest()'或'getAlgorithmName()'或者將散列與一些現有數據進行比較的東西? –
你是否檢查過沒有內存泄漏?生活時間變慢可能是一個症狀 – Pelocho
嗨@DominikSandjaja感謝您的快速回答。既然是一個生產環境,我的測試能力是有限的,所以我已經能夠減少問題的代碼片段(是在一個外部庫已被用於身份驗證),但我不能確保完全至極線,我猜是摘要。摘要(散列)部分。 –