带有SHA2的JasyptStringDigester突然变得很慢

时间:2015-02-13 10:22:49

标签: java jboss7.x sha256 digest jasypt

在我的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;
&#13;
&#13;

线程转储:

&#13;
&#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;
&#13;
&#13;

有人会帮忙吗?我已经坚持这个问题很长一段时间了。在https://bugs.openjdk.java.net/browse/JDK-8023983中发现了类似的问题,但我无法找到任何解决方案。

感谢。

2 个答案:

答案 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监控代码缓存:

enter image description here

我希望它会有所帮助:)

埃里克

答案 1 :(得分:0)

哪个操作系统?

如果是Linux,一旦速度变慢,请查看可用的熵(cat /proc/sys/kernel/random/entropy_avail)。如果该数字小于250左右,则系统需要更多随机性。这是服务器上的常见问题。网络流量或磁盘IO可以提供帮助。

为了使诊断更加困难,您实际上可能会在登录时获得短暂的加速。这是因为登录本身会产生一些网络流量,这有助于为熵池添加一些随机性。另一方面,SSH进入框可能会非常缓慢,因为它需要SSH会话密钥的一些随机性。在任何一种情况下(登录后加速或登录缓慢),熵都可能成为问题。

您可以考虑添加一些其他随机来源,例如havegedrng-tools

您可能会看到将某些“随机性”从/dev/urandom复制到/dev/random的建议,这似乎可以解决问题。但是/dev/urandom实际上并没有任何随机性,它只是一个随机播种的PRNG。因此,这只是通过破坏您正在使用的加密的安全性来避免这个问题。拒绝吧。