Java 将 SecureRandom 与 SunPKCS11 提供程序结合使用

标签 java pkcs#11 secure-random

我想使用我的启用 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):

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 将 SecureRandom 与 SunPKCS11 提供程序结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48658031/

相关文章:

java - 用java改变鼠标缓冲区

c++ - 使用 pkcs#11 从智能卡读取文本文件

java - 用合格证书签署文件-智能卡

Java SecureRandom 生成类似 Medium.com 的 URL(随机 12 个字符)

java - Java 版本 1.8 可以生成与 Java 版本 1.6 相同的 SecureRandom Value 吗?

java - 在 build.xml 中设置 ANT CLASSPATH

java - Swing 中的属性列表 GUI 组件

java - 创建 SQLite 数据库时出错 : "android.database.sqlite.SQLiteException: near(9598)"?

security - PKCS#11 测试套件

java - 我应该定期重新播种 SecureRandom 还是自动发生?