在使用 wildfly 8.2 和 Java 1.7 的生产环境中,我遇到了一个非常奇怪的情况。
情况是,当服务器启动超过 2 周时,登录开始降低性能。我一直在寻找可能表明问题所在的线索。然后在做了一些测试后,我得出的结论是,问题是当以明文形式插入的密码被加密以与已经插入的密码进行比较时。
当执行加密密码的函数时,它需要将近 2 分钟,但当服务器重新启动时,相同的执行时间不到 30 秒。
加密使用 java.security.MessageDigest 生成哈希。特别是使用 SHA-256 进行 50000 次迭代。知道为什么这个过程会随着时间的推移而变慢吗?我正在使用 /dev/urandom 来生成随机数,所以这不应该是问题。
下面是函数代码:
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;
}