【问题标题】:Adding Security Provider multiple times in Java application在 Java 应用程序中多次添加安全提供程序
【发布时间】:2017-12-25 03:52:23
【问题描述】:

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

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

我的问题是:

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

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

【问题讨论】:

    标签: java security bouncycastle java-security


    【解决方案1】:

    根据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());
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2019-05-14
    • 1970-01-01
    • 2016-02-29
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多