java 公钥 验签 xml_XML-Signature 语法和签名

importjava.io.StringWriter;importjava.security.KeyStore.PrivateKeyEntry;importjava.security.PublicKey;importjava.util.Collections;importjava.util.List;importjava.util.Optional;importjavax.xml.crypto.dsig.CanonicalizationMethod;importjavax.xml.crypto.dsig.DigestMethod;importjavax.xml.crypto.dsig.Reference;importjavax.xml.crypto.dsig.SignatureMethod;importjavax.xml.crypto.dsig.SignedInfo;importjavax.xml.crypto.dsig.Transform;importjavax.xml.crypto.dsig.XMLSignature;importjavax.xml.crypto.dsig.XMLSignatureFactory;importjavax.xml.crypto.dsig.dom.DOMSignContext;importjavax.xml.crypto.dsig.dom.DOMValidateContext;importjavax.xml.crypto.dsig.spec.C14NMethodParameterSpec;importjavax.xml.crypto.dsig.spec.TransformParameterSpec;importjavax.xml.transform.TransformerFactory;importjavax.xml.transform.dom.DOMSource;importjavax.xml.transform.stream.StreamResult;importlombok.Cleanup;importlombok.SneakyThrows;importlombok.experimental.UtilityClass;importlombok.extern.slf4j.Slf4j;importorg.dom4j.io.DOMWriter;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.w3c.dom.Node;@UtilityClass

@Slf4jpublic classSignUtils {private static final XMLSignatureFactory XML_SIGNATURE_FACTORY = XMLSignatureFactory.getInstance("DOM");private static final TransformerFactory TRANSFORMER_FACTORY =TransformerFactory.newInstance();

@SneakyThrowspublic staticReference getTransformReference(String uri) {

DigestMethod digestMethod= XML_SIGNATURE_FACTORY.newDigestMethod(DigestMethod.SHA1, null);

List transforms = Collections.singletonList(XML_SIGNATURE_FACTORY.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null));return XML_SIGNATURE_FACTORY.newReference("#" + uri, digestMethod, transforms, null, null);

}

@SneakyThrowspublic staticSignedInfo getSignedInfo(Reference ref) {

CanonicalizationMethod method= XML_SIGNATURE_FACTORY.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null);

SignatureMethod signatureMethod= XML_SIGNATURE_FACTORY.newSignatureMethod(SignatureMethod.RSA_SHA1, null);returnXML_SIGNATURE_FACTORY.newSignedInfo(method, signatureMethod, Collections.singletonList(ref));

}

@SneakyThrowspublic staticString sign(Document w3cDoc, PrivateKeyEntry keyEntry, SignedInfo si) {

Optional.ofNullable(w3cDoc)

.map(Document::getDocumentElement)

.map(Node::getFirstChild)

.map(Node::getFirstChild)

.ifPresent(e-> ((Element) e).setIdAttribute("id", true));

DOMSignContext dsc= newDOMSignContext(keyEntry.getPrivateKey(), Optional.ofNullable(w3cDoc).map(Document::getDocumentElement).get());

XMLSignature signature= XML_SIGNATURE_FACTORY.newXMLSignature(si, null);

signature.sign(dsc);

@Cleanup StringWriter strWriter= newStringWriter();

TRANSFORMER_FACTORY.newTransformer().transform(new DOMSource(w3cDoc), newStreamResult(strWriter));returnstrWriter.toString();

}

@SneakyThrowspublic static booleancheckSign(Node signNode, PublicKey publicKey) {

Optional.ofNullable(signNode.getPreviousSibling()).ifPresent(e-> ((Element) e).setIdAttribute("id", true)); DOMValidateContext valContext= newDOMValidateContext(publicKey, signNode);

XMLSignature signature=XML_SIGNATURE_FACTORY.unmarshalXMLSignature(valContext);returnsignature.validate(valContext);

}

@SneakyThrowspublic staticorg.w3c.dom.Document convert(org.dom4j.Document doc) {

log.info("org.dom4j.Document,outXml:[{}]", doc.asXML());return newDOMWriter().write(doc);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值