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

如何为WSSecDKEncrypt派生密钥加密KeyIdentifier?

如何在WSSecDKEncrypt中加密派生密钥的KeyIdentifier

我来帮你搞定这个问题——在使用WSS4J的WSSecDKEncrypt做派生密钥加密时,要加密派生密钥的KeyIdentifier,核心逻辑是用接收方的公钥对KeyIdentifier做非对称加密,确保只有接收方能解密并还原出派生密钥。下面是具体的实现步骤和代码示例:

核心思路

WS-Security的派生密钥(DK)加密流程里,KeyIdentifier用来标识派生出来的对称密钥。要加密它,你需要:

  1. 获取接收方的公钥(通常从对方的证书中提取)
  2. 给WSSecDKEncrypt配置好非对称加密算法、KeyIdentifier类型
  3. 把接收方的证书传给加密器,让它自动用公钥完成KeyIdentifier的加密

具体实现步骤

1. 加载接收方的证书(用于加密KeyIdentifier)

首先得加载接收方的密钥库,取出对应的证书(里面包含公钥):

// 加载接收方的JKS密钥库
KeyStore receiverStore = KeyStore.getInstance("jks");
receiverStore.load(
    new FileInputStream("/path/to/receiver_keystore.jks"),
    "receiver_store_password".toCharArray()
);
// 提取接收方证书(替换成实际的证书别名)
X509Certificate receiverCert = (X509Certificate) receiverStore.getCertificate("receiver_alias");

2. 配置WSSecDKEncrypt的加密参数

在你现有的代码基础上,添加KeyIdentifier加密的相关配置:

// 加载密钥信息以创建派生密钥(你的原有代码)
KeyStore clientStore = KeyStore.getInstance("jks");
clientStore.load(new FileInputStream(FILESTORE_PATH_CONST), KEY_PASSWORD_CONST.toCharArray());
byte[] keyBytes = clientStore.getKey(KEY_NAME_CONST, KEY_PASSWORD.toCharArray()).getEncoded();

WSSecDKEncrypt encBuilder = new WSSecDKEncrypt();
// 原有对称加密配置
encBuilder.setSymmetricEncAlgorithm(WSConstants.AES_256);
// --- 新增KeyIdentifier加密配置 ---
// 设置KeyIdentifier类型(可选:SKI_KEY_IDENTIFIER/THUMBPRINT_KEY_IDENTIFIER等)
encBuilder.setKeyIdentifierType(WSConstants.SKI_KEY_IDENTIFIER);
// 设置加密KeyIdentifier的非对称算法(推荐用RSA-OAEP,比RSA1_5更安全)
encBuilder.setKeyEncAlgo(WSConstants.RSA_OAEP);
// 传入接收方证书,让加密器提取公钥来加密KeyIdentifier
encBuilder.setReceiverCertificate(receiverCert);
// --- 派生密钥相关配置(按需调整)---
encBuilder.setKeyDerivationAlgorithm(WSConstants.PBKDF2); // 指定密钥派生算法
encBuilder.setIterationCount(10000); // 迭代次数,和接收方保持一致
encBuilder.setSalt(new byte[]{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}); // 盐值,和接收方保持一致

3. 执行加密并生成最终安全文档

最后把配置好的加密器应用到SOAP消息上:

// 假设你已经有SOAPMessage实例
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(soapMessage.getSOAPPart());
// 执行加密,生成包含加密KeyIdentifier的安全文档
Document encryptedDoc = encBuilder.build(soapMessage.getSOAPPart(), secHeader);

关键注意事项

  • JCE权限文件:使用AES-256需要Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files,不然会抛出加密强度不足的异常。
  • 参数一致性:密钥派生的迭代次数、盐值等参数必须和接收方完全一致,否则对方没法还原出相同的对称密钥。
  • KeyIdentifier类型选择:SKI_KEY_IDENTIFIER(主题密钥标识符)是常用选项,体积小易验证;THUMBPRINT_KEY_IDENTIFIER是证书哈希,安全性更高但体积稍大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:48:53