从 Java 安全提供程序中删除特定算法

问题描述

我有一个 tomcat 7.x servlet 容器,它从其 webapps 目录部署多个 war 文件。我想确保部署在我的 tomcat 中的这些应用程序都没有使用 MD5 算法。我可以通过以下方式从 Java 中做到这一点:

Provider[] providers = Security.getProviders();
for(Provider p : providers) {
  p.remove("MessageDigest.MD5");
}

但是,这需要部署在我的 tomcat 中的所有 Web 应用程序都执行相同的操作。无论如何,对于这个 tomcat 实例,我是否只能在全局范围内执行一次此操作?

一种可能性是将其添加到 servlet init 方法中,配置 servlet 以在从全局部署描述符启动时加载。

我尝试这样做,但在我的 tomcat 实例中,无论我在哪里这样做,以下几行都不会抛出异常:

MessageDigest hash = MessageDigest.getInstance("MD5");
hash.digest("ABCDEFGH".getBytes());

自从我删除 NoSuchAlgorithmException 以来,我一直期待它抛出 MessageDigest.MD5。可能是什么原因?

解决方法

根据Providers javadoc

服务类型Provider保留供安全使用 框架。不能添加、删除或修改此类服务 按应用程序。

因此您可以删除 Provider,但不能从 Provider 中删除单个服务。