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

Adding Security Provider multiple times in Java application

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

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

我的问题是:

  1. 是否需要在应用中多次添加安全提供者?它有什么用吗?对我来说,这没有意义,添加一次就足够了。
  2. 它是否是应用程序中潜在内存泄漏的候选对象?

澄清一下,我想在我的应用程序中以编程方式添加 Bouncy Castle 安全提供程序,而不是通过 JRE 静态添加。 IMO,在应用程序中添加一次 Bouncy Castle 安全提供程序就足够了,我不需要多次这样做。

根据addProvider's javadoc

Returns:
the preference position in which the provider was added, or -1 if the provider was not added because it is already installed

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

当然你可以优化它并在主 class 中只调用一次(有些 class 你知道它总是在应用程序启动时加载),但我不会太担心关于那个。

我曾经使用过在不同部分调用多个 addProvider 的系统(因为它们可以以任何顺序调用并且彼此独立),所有 运行 在相同的 JVM,它从未发生任何内存泄漏。当然这只是我的情况,但我不知道这会导致泄漏。


如果您只想在提供商尚未添加时调用 addProvider,您可以调用 Security.getProvider() 进行检查。如果提供者不在 JVM 中,它 returns null:

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