如何为WSSecDKEncrypt派生密钥加密KeyIdentifier?
如何在WSSecDKEncrypt中加密派生密钥的KeyIdentifier
我来帮你搞定这个问题——在使用WSS4J的WSSecDKEncrypt做派生密钥加密时,要加密派生密钥的KeyIdentifier,核心逻辑是用接收方的公钥对KeyIdentifier做非对称加密,确保只有接收方能解密并还原出派生密钥。下面是具体的实现步骤和代码示例:
核心思路
WS-Security的派生密钥(DK)加密流程里,KeyIdentifier用来标识派生出来的对称密钥。要加密它,你需要:
- 获取接收方的公钥(通常从对方的证书中提取)
- 给
WSSecDKEncrypt配置好非对称加密算法、KeyIdentifier类型 - 把接收方的证书传给加密器,让它自动用公钥完成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
相关产品推荐
相关产品推荐

