我想将启用PKCS#11的设备用作SecureRandom的来源。
所以我做了以下工作:
Provider pkcs11provider = new sun.security.pkcs11.SunPKCS11(pkcs11config);
Security.addProvider(pkcs11provider);
byte[] rb = new byte[100];
SecureRandom sr = SecureRandom.getInstance("PKCS11", pkcs11provider);
sr.nextBytes(rb);
我总是有一个例外:
Exception in thread "main" java.security.NoSuchAlgorithmException: no such algorithm: PKCS11 for provider SunPKCS11-HSM
at sun.security.jca.GetInstance.getService(GetInstance.java:101)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:218)
at java.security.SecureRandom.getInstance(SecureRandom.java:383)
我做错了什么?根据《 JDK PKCS#11参考指南》,
"PKCS11"
应该受支持SecureRandom
算法。 最佳答案
“ PKCS11”听起来不像算法名称。它是提供者名称。提供者可以为特定的加密操作拥有自己的算法名称。要查看它们具有的所有算法,可以运行此代码片段以查看它们。
Set<Provider.Service> services = pkcs11provider.getServices();
services.forEach(service ->
{
// System.out.println(service.getType()); // --> Look for 'SecureRandom' type
System.out.println(service.getAlgorithm());
});
查找“ SecureRandom”类型,这是您必须作为
SecureRandom.getInstance(.., ..)
中的第一个参数传递的算法。关于java - Java与SunPKCS11提供程序一起使用SecureRandom,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48658031/