代码之家  ›  专栏  ›  技术社区  ›  Christopher Schultz

是否可以在不提供完整转换的情况下检查特定的密码块模式支持?

  •  0
  • Christopher Schultz  · 技术社区  · 6 年前

    我有一个单元测试,它通过Java 8 +,在Java 7上失败,因为在Java 7和更早的时候,GCM模式似乎不被支持。

    我知道我可以尝试用转换创建密码,例如 AES/GCM/PKCS5Padding 抓住 NoSuchAlgorithmException ,但可能会为此引发异常 特定的 转换,而不仅仅是因为不支持GCM模式本身(在 任何 变换)。

    我也可以检查JVM版本,但对于使用第三方加密库(如BouncyCastle)的环境或具有其他供应商内置支持(正好包括对GCM的支持)的JVM,这不是一个有效的检查。

    我想跳过考试 只有 如果一般不支持GCM,而且不支持我在代码中选择的特定(和完整)转换。

    有可能从Java中检测支持的密码块模式吗?或者只是可以尝试一个特定的转换,看看它是否有效?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Maarten Bodewes    6 年前

    是的,您可以遍历提供者和服务,并查找一个名为GCM的密码服务,例如。

    Provider[] provs = Security.getProviders();
    for (Provider prov : provs) {
        Set<Service> services = prov.getServices();
        for (Service service : services) {
            if (!service.getType().matches("(?i)Cipher")) {
                break;
            }
            String algo = service.getAlgorithm();
            if (algo.matches("(?i).*/GCM/.*")) {
                System.out.println(service);
            }
        }
    }
    

    注意,您可能需要检查旧的Java运行时的无限加密,例如使用我的答案。 here .

    您可能会认为GCM只对128位密码有效,并且您不太可能找到不使用AES的实现。此外,除了 "NoPadding" 这对于GCM模式是有意义的(无论如何,在算法字符串中,我不是在说 GCCMParameterSpec 当然)。

    当心以后的提供者可能不会返回 "AES/GCM/NoPadding" 但归来 "AES_128/GCM/NoPadding" , "AES_192/GCM/NoPadding" "AES_256/GCM/NoPadding" 相反。这也会影响 Provider#getService(type, algorithm) 调用,使其在需要检查时无效 “AES/GCM/不添加” ,即具有任何有效密钥大小的AES。