我有一个单元测试,它在 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/