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

标签 java cryptography block-cipher

我有一个单元测试,它在 Java 8+ 中通过,但在 Java 7 中失败,因为 Java 7 及更早版本似乎不支持 GCM 模式。

我知道我可以尝试使用转换创建密码,例如AES/GCM/PKCS5Padding 并捕获 NoSuchAlgorithmException,但该异常可能只是针对该特定转换而抛出,而不仅仅是因为 GCM 模式本身不是“t 支持(在任何转换内)。

我也可以只检查 JVM 版本,但这对于使用第 3 方加密库(例如 BouncyCaSTLe)或具有其他供应商内置支持的 JVM 的环境来说不是有效的检查其中恰好包括对 GCM 的支持。

只有在一般情况下不支持 GCM 时,而不仅仅是在不支持我在代码中选择的特定(且完整)转换时,我才愿意跳过测试。

是否可以从 Java 检测支持的密码 block 模式?或者是否只能尝试特定的转换并查看它是否有效?

最佳答案

是的,您可以遍历提供者和服务,并查找名称中包含 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/NoPadding”(即具有任何有效 key 大小的 AES),则使其无用。

关于java - 是否可以在不提供整个转换的情况下检查特定密码 block 模式支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54066489/

相关文章:

java - 这种 AES 加密是否足够安全?

c++ - 使用 AES 和 Crypto++ 加密解密单个 block

java - 是否应该捕获并处理未经检查的异常?

java - 如何禁用特定网址的 Spring 安全性

java - 中断时间超过阈值的线程的最佳实践

.net - BouncyCasSTLe RSAPrivateKey 到 .NET RSAPrivateKey

.net - Azure WindowsCryptographicException : The specified network password is not correct when publishing despite correct password

java - 我无法在 PE 文件网中使用queuequery 查询队列元素

java - PBKDF2-HMAC-SHA256 for JAVA 的可靠实现

java - 加密NULL