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

Posted

技术标签:

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

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

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

我的问题是:

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

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

【问题讨论】:

【参考方案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());

【讨论】:

请注意,由于存在错误,您应该使用 only-add-if-not-there 加载样式。错误问题:bugs.openjdk.java.net/browse/JDK-8168469

以上是关于在 Java 应用程序中多次添加安全提供程序的主要内容,如果未能解决你的问题,请参考以下文章

Java 列表项在页面重新加载时重新添加到 thymeleaf 下拉列表中,多次出现

Java版本体系

应用程序被java安全阻止怎么办

如何在提供平台以运行不同语言代码的Web应用程序的tomcat中设置Java安全策略[重复]

处理 Android 自定义内容提供程序中的(跨进程)异常

防止多次登录