在Java应用程序中多次添加安全提供程序

时间:2017-07-19 18:04:52

标签: java security bouncycastle java-security

我们有一个Java应用程序,其中作业计划每5分钟运行一次。在该作业中,有一个安全组件,每次执行时都会执行以下操作:

java.security.Security
            .addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

我的问题是:

  1. 是否需要在应用程序中多次添加安全提供程序?它有用吗?对我而言,它没有意义,只需添加一次即可。
  2. 它是应用程序中潜在内存泄漏的候选者吗?
  3. 为了澄清,我想在我的应用程序中以编程方式添加Bouncy Castle安全提供程序,而不是通过JRE静态添加。 IMO,在应用程序中添加一次Bouncy Castle安全提供程序就足够了,我不需要多次这样做。

1 个答案:

答案 0 :(得分:10)

根据addProvider's javadoc

  

<强>返回:
  添加提供程序的首选位置,如果由于已安装提供程序而未添加提供程序,则为-1

addProvider已检查是否已安装提供程序,因此,即使您在应用程序中有多个调用,也只会添加一次。在添加之后,它将保持在那里直到JVM停止(或者如果有人调用removeProvider)。

当然你可以优化它并在主类中放入一个单独的调用(一些你知道它总是在应用程序启动时加载的类),但我不会为此担心。

我曾经使用过在不同部分对addProvider进行多次调用的系统(因为它们可以按任何顺序调用,彼此独立),都在同一个JVM中运行,而且从不有任何内存泄漏。当然这只是我的情况,但我不知道这会造成泄密。

如果您只想在尚未添加提供商的情况下拨打addProvider,则可以致电Security.getProvider()进行检查。如果提供程序不在JVM中,则返回null

// add provider only if it's not in the JVM
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
    Security.addProvider(new BouncyCastleProvider());
}