java实现xml的签名和验证

//签名函数 

public static Element SignEnveloped
 (final String strTagNameOfElementsToSign,
 final Element elemParent,
 final String strReferenceIdentifier,
 final PrivateKey privateKey,
 final PublicKey publicKey,
 final String constants)
 throws Exception
{
  org.apache.xml.security.Init.init();
  String strSignatureAlgorithm = org.apache.xml.security.signature.XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1;
  
  String strSignatureCanonicalizationAlgorithm = org.apache.xml.security.transforms.Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS;
  
  String strReferenceCanonicalizationAlgorithm = org.apache.xml.security.transforms.Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS;

  String strReferenceDigestAlgorithm = org.apache.xml.security.utils.Constants.ALGO_ID_DIGEST_SHA1;
  
  
  
 if (null == strTagNameOfElementsToSign)
 {
  throw new Exception("Sign Failed: Invalid Parameter: TagNameOfElementsToSign is null");
 }
 if (null == elemParent)
 {
  throw new Exception("Sign Failed: Invalid Parameter: Parent is null");
 }
// if (null == strReferenceIdentifier)
// {
//  throw new Exception("Sign Failed: Invalid Parameter: ReferenceIdentifier is null");
// }
 if (null == privateKey)
 {
  throw new Exception("Sign Failed: Invalid Parameter: PrivateKey is null");
 }
 if (null == publicKey)
 {
  throw new Exception("Sign Failed: Invalid Parameter: PublicKey is null");
 }
 if (null == constants)
 {
  throw new Exception("Sign Failed: Invalid Parameter: Constants is null");
 }
 org.apache.xml.security.utils.Constants.setSignatureSpecNSprefix("ds");
 org.w3c.dom.Element domParent = elemParent; 
 final org.w3c.dom.Document domDocument = domParent.getOwnerDocument();
 final org.w3c.dom.NodeList nlToSigns = domParent.getElementsByTagName
  (strTagNameOfElementsToSign);
 if (null == nlToSigns)
 {
  final String strErrorMessage = "org.w3c.dom.Element.getElementsByTagNameNS unexpectedly returned null";
//  XMLSecurityApacheExtension.log.error
//   (strErrorMessage);
  throw new Exception("Sign Failed: " + strErrorMessage);
 }
 if (1 != nlToSigns.getLength())
 {
  final String strErrorMessage = "org.w3c.dom.Element.getElementsByTagNameNS unexpectedly returned "
   + nlToSigns.getLength()
   + " nodes";
//  XMLSecurityApacheExtension.log.error
//   (strErrorMessage);
  throw new Exception("Sign Failed: " + strErrorMessage);   
 }
 final org.w3c.dom.Element domToSign = (Element)nlToSigns.item(0);
 final org.apache.xml.security.signature.XMLSignature signature = new org.apache.xml.security.signature.XMLSignature
  (domDocument,
  "",
  strSignatureAlgorithm,
  strSignatureCanonicalizationAlgorithm);
 domToSign.appendChild(signature.getElement());
 final org.apache.xml.security.signature.SignedInfo signedInfo = signature.getSignedInfo();
 final IDResolver resolver = new IDResolver
  (domDocument);
 signedInfo.addResourceResolver(resolver);
 final org.apache.xml.security.transforms.Transforms transforms = new org.apache.xml.security.transforms.Transforms
  (domDocument);
 transforms.addTransform
  (org.apache.xml.security.transforms.Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
 transforms.addTransform
  (strReferenceCanonicalizationAlgorithm);
// signature.addDocument
//  ("#" + strReferenceIdentifier,
//  transforms,
//  strReferenceDigestAlgorithm);
 signature.addDocument
 ("#" + strReferenceIdentifier,
 transforms,
 strReferenceDigestAlgorithm);
 signature.addKeyInfo
  (publicKey);
 signature.sign(privateKey);
 final org.w3c.dom.Element elemSignature = signature.getElement();
 return elemSignature;
// final org.w3c.dom.NodeList nodeListSignatureValue = elemSignature.getElementsByTagNameNS
//  (constants,
//  "SignatureValue");
// final org.w3c.dom.Element elemSignatureValue = (org.w3c.dom.Element)nodeListSignatureValue.item(0);
// org.eclipse.higgins.sts.utilities.XMLHelper.stripWhiteSpaceFromElement(elemSignatureValue);
// domParent = org.eclipse.higgins.sts.utilities.XMLHelper.reparseElement
//  (domParent);
// org.eclipse.higgins.sts.api.IElement elemResult = new org.eclipse.higgins.sts.common.Element();
// elemResult.set(domParent);
// return elemResult;
// Document doc = elemSignatureValue.getOwnerDocument();
// Element sign = doc.getDocumentElement();
// return sign;
}



//验证函数

public static boolean VerifyEnveloped
 (final Element elemSignedElement
 )
 throws Exception
{
  org.apache.xml.security.Init.init();
  
 if (null == elemSignedElement)
 {
  throw new Exception("Verify Failed: Invalid Parameter: SignedElement is null");
 }
// if (null == constants)
// {
//  throw new Exception("Verify Failed: Invalid Parameter: Constants is null");
// }
 final org.w3c.dom.Element domSignedElement = (org.w3c.dom.Element)elemSignedElement;
 final org.w3c.dom.Document domParent = domSignedElement.getOwnerDocument();
    final Element elemContext = org.apache.xml.security.utils.XMLUtils.createDSctx
     (domParent,
     "ds",
     org.apache.xml.security.utils.Constants.SignatureSpecNS);
    final Element elemSignature = (Element) org.apache.xpath.XPathAPI.selectSingleNode
     (domParent,
        "//ds:Signature",
        elemContext);
//    final org.apache.xml.security.signature.XMLSignature signature = new org.apache.xml.security.signature.XMLSignature
//     (elemSignature,
//     null);
    final org.apache.xml.security.signature.XMLSignature signature = new org.apache.xml.security.signature.XMLSignature
 (elemSignedElement,
 null);
    signature.addResourceResolver(new IDResolver(domParent));
   
    final org.apache.xml.security.keys.KeyInfo keyInfo = signature.getKeyInfo();
    boolean bResult = false;
    if (keyInfo != null)
    {
       if (keyInfo.containsX509Data())
       {
          System.out.println("Found a X509Data element in the KeyInfo");
       }
       final java.security.cert.X509Certificate cert = signature.getKeyInfo().getX509Certificate();
       if (cert != null)
       {
        bResult = signature.checkSignatureValue(cert);
       }
       else
       {
          System.out.println("Did not find an X509Data element in the KeyInfo");
          final PublicKey publicKey = keyInfo.getPublicKey();
          if (publicKey != null)
          {
           bResult = signature.checkSignatureValue(publicKey);
          }
          else
          {
             System.out.println("Did not find a public key, so I can't check the signature");
          }
       }
    }
    else
    {
     System.out.println("Did not find a KeyInfo");
    }
    return bResult;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java 可以通过使用数字证书来实现电子签名。数字证书是由可信的证书机构颁发的电子文件,用于验证签名者的身份,并确保签名的真实性和完整性。 Java 提供了许多 API 用于实现数字签名,其中最常用的是 Java Security API。下面是一个简单的示例代码,用于使用 Java Security API 对数据进行数字签名: ```java import java.io.*; import java.security.*; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; public class SignatureExample { public static void main(String[] args) throws Exception { // 读取数字证书 CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream in = new FileInputStream("path/to/certificate.crt"); X509Certificate cert = (X509Certificate) cf.generateCertificate(in); in.close(); // 获取证书公钥 PublicKey publicKey = cert.getPublicKey(); // 读取要签名的数据 String data = "Hello, world!"; byte[] dataBytes = data.getBytes(); // 创建数字签名对象 Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(loadPrivateKey("path/to/privatekey.pem")); signature.update(dataBytes); // 对数据进行签名 byte[] signatureBytes = signature.sign(); // 验证签名 Signature verifier = Signature.getInstance("SHA256withRSA"); verifier.initVerify(publicKey); verifier.update(dataBytes); boolean verified = verifier.verify(signatureBytes); System.out.println("Signature verified: " + verified); } // 读取私钥 private static PrivateKey loadPrivateKey(String filename) throws Exception { BufferedReader br = new BufferedReader(new FileReader(filename)); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { if (!line.startsWith("-")) { sb.append(line); } } br.close(); byte[] keyBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(sb.toString()); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePrivate(spec); } } ``` 在上面的示例代码中,我们首先读取数字证书,然后获取公钥。接下来,我们创建 `Signature` 对象并使用私钥对数据进行签名。最后,我们使用公钥验证签名的真实性。 需要注意的是,在上面的示例代码中,我们还需要实现 `loadPrivateKey` 方法来读取私钥。私钥应该存储在一个 PEM 格式的文件中,这个方法会读取文件并将其转换成 `PrivateKey` 对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值