java - 使用 LunaProvider 在 HSM 中进行并发签名会抛出 CKR_DATA_INVALID
问题描述
当我同时尝试使用 HSM 中的相同密钥进行签名时,一些签名失败并出现以下错误:com.safenetinc.luna.exception.LunaCryptokiException: function 'C_Sign' returns 0x20 (CKR_DATA_INVALID)
只有一个线程和一个我的 jar 实例,我没有错误。更多线程我更经常签名失败。 重要的一点,如果我有 2 个实例,每个实例只有一个线程,也会出现问题。
我正在使用 Luna JSP 提供程序。算法是 SHA256withECDSA。
我也尝试了令牌连接,但结果相同。我在 crystoki.ini 中检查了我的超时,在超时之前发生了失败。即使为 keyStore 或 privateKey 使用 Singleton,我也有问题。
线程生成器:
public static void main(String[] args) {
SpringApplication.run(DccHsmTest.class, args);
for (int i=0; i<4; i++)
{
Multithreading object = new Multithreading();
object.start();
}
}
private byte[] CHALLENGE = new byte[10000];
public void run()
{
try
{
final HsmService hsmService = new HsmService();
hsmKeyStore = hsmService.hsmKeyStore(hsmPartition, hsmPassword);
PrivateKey privateKey = (PrivateKey) hsmKeyStore.getKey(aliasToRetrieve, password);
while(sign(privateKey)){
...
}
throw new RuntimeException();
}
catch (Exception e)
{
...
}
}
private static boolean sign(PrivateKey privateKey) {
try {
Signature signature = Signature.getInstance("SHA256withECDSA", "LunaProvider");
signature.initSign(privateKey);
signature.update(CHALLENGE);
signature.sign();
return true;
}
catch(Exception e){
...
return false;
}
}
HsmService
@Service
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class HsmService {
public KeyStore hsmKeyStore(String hsmPartition, String hsmPassword) throws
KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
LunaProvider lunaProvider = new LunaProvider();
Security.addProvider(lunaProvider);
LunaSlotManager lunaSlotManager = LunaSlotManager.getInstance();
lunaSlotManager.login(hsmPartition, hsmPassword);
KeyStore keyStore = KeyStore.getInstance("Luna");
keyStore.load(null, null);
return keyStore;
}
}
CKR_DATA_INVALID 的错误定义是:
加密操作的明文输入数据无效。
但我总是传递相同的输入,有时它会起作用。
The CKlog doesn't provide much details : FINISign CKR_DATA_INVALID (5811ms) {"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }
只是似乎返回了一个错误的签名
解决方案
最后一个简单的重启解决了这个问题。现在我必须找出这个问题是由于我的代码中 HSM 使用不当,还是由于其他开发人员的测试(HSM 被其他项目使用)
推荐阅读
- python - 为什么 numpy.angle() 不是 ufunc?
- python - 在 Kivy 中使用 refresh_from_data() 时 RecycleView 更改索引
- python - 根据条件过滤数据框
- android - 如何从 SQLite 检索数据到 EditText 屏幕并使用 onClick 事件滚动
- jquery - 试图删除或覆盖 div 的内联样式
- java - 如何在单元测试中模拟 JPA 存储库的 find 方法
- c++ - Visio DrawLine() 方法没有按我的预期工作
- python - python pandas按列表中存在的部分行过滤
- highcharts - Highcharts 和 NPM/节点
- node.js - 是否可以离线安装全局节点包?