Java 将 SecureRandom 与 SunPKCS11 提供程序一起使用

Java use SecureRandom with SunPKCS11 provider

我想使用支持 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(.., ..) 的算法。