You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Utimaco HSM与Java应用集成问题:无法获取存储的密钥

Utimaco HSM Java集成密钥获取问题排查

1. 密钥存储代码的核心缺失

你提供的密钥存储片段未完成实际导入操作:

String device = "3001@127.0.0.1";
cxi = new CryptoServerCXI(device, 3000);
cxi.logon("CXI_HMAC", "", "*******".getBytes());
String group = "test1";
CryptoServerCXI.KeyAttributes attr = new CryptoServerCXI.KeyAttributes();
attr.setAlgo(CryptoServerCXI.KEY_ALGO_AES);
attr.setSize(256);
attr.setName("CXI_AES_IMP_KEY");
attr.setGroup(group);

final byte[] aesKeyBytes = MessageDigest.getInstance("SHA-256").digest(hsmKeyDTO.getMasterKey().getBytes());

System.out.println("aesKey: --------" + aesKeyBytes);

CryptoServerCXI.KeyComponents comp = new CryptoServerCXI.KeyComponents(aesKeyBytes);
// 缺少关键的导入调用,密钥并未存入HSM
// 需添加:
// CryptoServerCXI.Key importedKey = cxi.importKey(attr, comp);

没有执行importKey,HSM中根本不存在目标密钥,后续自然无法查找导出。

2. 密钥导出的逻辑错误

(1)HSM的密钥导出权限限制

Utimaco HSM默认禁止导出明文密钥(对称密钥/私钥),除非密钥在创建/导入时明确设置了setExportable(true)属性。如果你的密钥未开启该权限,exportKey调用会直接失败。

(2)exportKey方法的参数误用

你调用的exportKey(rsaKey, CryptoServerCXI.KEY_TYPE_PRIVATE, aesKey)是用AES密钥加密导出RSA私钥,得到的是加密后的密钥Blob,并非明文密钥。若要获取明文,需满足两个条件:

  • 目标密钥已开启可导出属性
  • 使用对应明文导出的重载方法

3. 密钥查找的匹配问题

cxi.findKey(attr)仅返回第一个匹配属性的密钥,若HSM中存在多个相似密钥,可能返回非目标密钥。需确保查找时的属性(group、name、algo、size等)与存储时完全一致。

修复步骤参考

步骤1:补全密钥导入流程

导入时开启可导出属性(若需后续导出明文):

// 开启密钥可导出权限
attr.setExportable(true);
// 执行导入操作
CryptoServerCXI.Key importedKey = cxi.importKey(attr, comp);

步骤2:正确导出明文密钥

在密钥允许明文导出的前提下,使用对应重载方法:

// 导出明文AES密钥
byte[] plainAesKey = cxi.exportKey(aesKey, CryptoServerCXI.KEY_TYPE_SECRET);

// 导出明文RSA私钥
byte[] plainRsaPrivateKey = cxi.exportKey(rsaKey, CryptoServerCXI.KEY_TYPE_PRIVATE);

步骤3:校验密钥属性一致性

确认查找密钥时的KeyAttributes与存储时完全匹配,包括可导出状态、密钥分组等细节。

内容的提问来源于stack exchange,提问作者Sthogari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:30:12