在使用 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);
} …Run Code Online (Sandbox Code Playgroud)