在我的Web应用程序中,登录密码被哈希并使用带有SHA256的JasyptStringDigester保存。在登录期间,用户输入的密码将用相同的消化器进行哈希处理以进行比较。
然而,在应用程序运行大约2天后,登录变得非常缓慢。一旦发生,我必须重新启动服务器才能恢复。
使用线程转储,我发现减速是由消化器引起的,它耗尽了CPU资源。我试图将JCE提供程序从默认提供程序更改为bouncycastle但它没有帮助。
出现此问题时,我还检查了JVM中的momery用法,但是有很多这些用法。
环境:
JDK 7u60
JBoss 7.1.1 Final
Digester配置(用作单身人士):
<bean id="jasyptStringDigester" class="org.jasypt.digest.StandardStringDigester">
<property name="provider" ref="bouncyCastleProvider" />
<property name="algorithm" value="SHA-256" />
<property name="iterations" value="100000" />
<property name="saltGenerator">
<bean id="zeroSaltGenerator" class="org.jasypt.salt.ZeroSaltGenerator"/>
</property>
<property name="saltSizeBytes" value="10"/>
</bean>
<bean id="bouncyCastleProvider" class="org.bouncycastle.jce.provider.BouncyCastleProvider"/>
&#13;
线程转储:
"ajp--10.88.90.34-8009-22" daemon prio=10 tid=0x00007ff2100ad800 nid=0xc7e runnable [0x00007ff1a9ae4000]
java.lang.Thread.State: RUNNABLE
at org.bouncycastle.crypto.digests.SHA256Digest.Sum0(Unknown Source)
at org.bouncycastle.crypto.digests.SHA256Digest.processBlock(Unknown Source)
at org.bouncycastle.crypto.digests.GeneralDigest.finish(Unknown Source)
at org.bouncycastle.crypto.digests.SHA256Digest.doFinal(Unknown Source)
at org.bouncycastle.jcajce.provider.digest.BCMessageDigest.engineDigest(Unknown Source)
at java.security.MessageDigest.digest(MessageDigest.java:353)
at java.security.MessageDigest.digest(MessageDigest.java:399)
at org.jasypt.digest.StandardByteDigester.digest(StandardByteDigester.java:979)
- locked <0x0000000748e4a9c0> (a org.bouncycastle.jcajce.provider.digest.SHA256$Digest)
at org.jasypt.digest.StandardByteDigester.digest(StandardByteDigester.java:933)
&#13;
有人会帮忙吗?我已经坚持这个问题很长一段时间了。在https://bugs.openjdk.java.net/browse/JDK-8023983中发现了类似的问题,但我无法找到任何解决方案。
感谢。
答案 0 :(得分:2)
我有完全相同的问题,熵不是原因。 SHA256摘要不需要随机。问题是JIT(及时)编译机制,允许直接在本机代码中编译一些Hotspot函数。 JDK7中存在一个已知问题:http://www.oracle.com/technetwork/java/javase/documentation/javase7supportreleasenotes-1601161.html在代码缓存已满时禁用本机编译器。在这种情况下,SHA digest不会本地执行并变得很长!
要重现,只需禁用编译器:
-Djava.compiler=NONE
解决方案是迁移到Java 8,Java 7的解决方法是使用JVM选项根据您的需要增加CodeCache大小。
-XX:ReservedCodeCacheSize=300m
您可以通过JConsole监控代码缓存:
我希望它会有所帮助:)
埃里克
答案 1 :(得分:0)
哪个操作系统?
如果是Linux,一旦速度变慢,请查看可用的熵(cat /proc/sys/kernel/random/entropy_avail
)。如果该数字小于250左右,则系统需要更多随机性。这是服务器上的常见问题。网络流量或磁盘IO可以提供帮助。
为了使诊断更加困难,您实际上可能会在登录时获得短暂的加速。这是因为登录本身会产生一些网络流量,这有助于为熵池添加一些随机性。另一方面,SSH进入框可能会非常缓慢,因为它需要SSH会话密钥的一些随机性。在任何一种情况下(登录后加速或登录缓慢),熵都可能成为问题。
您可以考虑添加一些其他随机来源,例如haveged或rng-tools。
您可能会看到将某些“随机性”从/dev/urandom
复制到/dev/random
的建议,这似乎可以解决问题。但是/dev/urandom
实际上并没有任何随机性,它只是一个随机播种的PRNG。因此,这只是通过破坏您正在使用的加密的安全性来避免这个问题。拒绝吧。