我正在使用以下代码片段来获取指定算法的工厂实例。但它正在抛出一个java.security.NoSuchAlgorithmException
。我在jre1.6的java项目中使用它。
是否需要任何外部库(jar)?我在Android应用程序中尝试时的代码相同,但工作正常。
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5AND256BITAES-CBC-OPENSSL");
} catch (Exception e) {
e.printStackTrace();
}
Provider[] providers = Security.getProviders();
if (null == providers) {
System.out.println("Providers are not available.");
return;
}
for (Provider provider : providers) {
System.out.println("Provider: " + provider.getName());
Set<Provider.Service> services = provider.getServices();
for (Provider.Service service : services) {
System.out.println("\tAlgorithm: " + service.getAlgorithm());
}
}
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance(providers[0].getServices().iterator().next().getAlgorithm());
if (null == factory) {
System.out.println("Getting instance of specified algorithm failed.");
} else {
System.out.println("Success.");
}
} catch (Exception e) {
e.printStackTrace();
}
以上是经过编辑的代码,并抛出以下异常:
java.security.NoSuchAlgorithmException: SHA1PRNG SecretKeyFactory not available
at javax.crypto.SecretKeyFactory.<init>(DashoA13*..)
at javax.crypto.SecretKeyFactory.getInstance(DashoA13*..)
答案 0 :(得分:2)
"PBEWITHMD5AND256BITAES-CBC-OPENSSL"
是Bouncy Castle提供程序的一部分,您可能必须下载该库才能在Java SE上使用它。不要忘记下载unlimited strength jurisdiction policy files。
至于第二个例外,如果您只询问第一个提供商的第一个服务的算法,您将获得一个仅对特定类型有效的算法。在这种情况下,它仅适用于SecureRandom
,而不适用于SecretKeyFactory
,如果您已将.getAlgorithm()
替换为.getType()
,则可以使用。{/ p>
答案 1 :(得分:1)
根据SecretKeyFactory.getInstance(String algorithm)
的文档:
algorithm
- 请求的密钥算法的标准名称。请参阅“Java加密体系结构参考指南”中的附录A.
因此根据该文档调用SecretKeyFactory.getInstance("SHA1PRNG")
无效时,您应该期待和错误。
答案 2 :(得分:-1)
执行此处的步骤。我做了,结果很成功。
步骤1.下载JDK或JRE的Bouncy Castle提供程序(JDK 1.6的bcprov-jdk16-146.jar);
步骤2.将provider .jar文件复制到Java Runtime(JRE)extensions子文件夹;对于Windows机器,JRE 1.6(如果存在)通常安装在: 示例:C:\ Program Files \ Java \ jre6 \ lib \ ext C:\ Program Files \ Java \ jdk1.6.0_16 \ jre \ lib \ ext
步骤3.将Bouncy Castle提供程序添加到java.security文件中以启用它;该文件位于JRE位置的\ lib \ security \子文件夹中(注意!两个位置 - 独立的JRE和来自JDK的JRE);编辑文件并添加语句
security.provider.N = org.bouncycastle.jce.provider.BouncyCastleProvider 注意:N必须是顺序的下一个数字。