当前位置:编程学习 > JAVA >>

签名数据后台解析的时候,总是有问题,大神们帮看看

         oSignedData.Content = "asdasd";
// oSignedData.Signers=oCert;
          SignedResult = oSignedData.Sign(oSigner, false, CAPICOM_ENCODE_BASE64);
       


var oVerifyData = new ActiveXObject("CAPICOM.SignedData");

oVerifyData.Verify(SignedResult,false,CAPICOM_ENCODE_BASE64);

    alert("验证正确,原始签名数据:"+oVerifyData.Content);


  public boolean SignedData_Verify(String signedData,String s) {
           boolean verifyRet = true;
           try {
//            String strSignRes = "签名结果";
            byte[] byteSignRes = Base64.decode(signedData);
            
                  // 新建PKCS#7签名数据处理对象
                  CMSSignedData sign = new CMSSignedData(byteSignRes);
                  
                  // 添加BouncyCastle作为安全提供
                  Security.addProvider(new
                    org.bouncycastle.jce.provider.BouncyCastleProvider());
                                
                  // 获得证书信息
                  CertStore certs = sign.getCertificatesAndCRLs("Collection", "BC");
                  
                  // 获得签名者信息
                  SignerInformationStore signers = sign.getSignerInfos();
                  Collection c = signers.getSigners();
                  Iterator it = c.iterator();
                  
                  // 当有多个签名者信息时需要全部验证
                  while (it.hasNext()) {
                         SignerInformation signer = (SignerInformation) it.next();
                         
                         // 证书链
                         Collection certCollection = certs.getCertificates(signer
                                       .getSID());
                         Iterator certIt = certCollection.iterator();
                         X509Certificate cert = (X509Certificate) certIt.next();
                         System.out.println(cert.getPublicKey()+"  "+cert.getSigAlgName()+"  "+cert.getSubjectDN()); 
                         // 验证数字签名
                         if (signer.verify(cert.getPublicKey(), "BC")) {
                                verifyRet = true;
                                System.out.println("验证数字签名成功"+new String(signer.getContentDigest(),"utf8"));
                                MessageDigest md = MessageDigest.getInstance("MD5","BC");
                                md.update(s.getBytes());
//                                System.out.println("signData=" + new String(signData,"utf8"));
//                                byte[] digestedData1 = md.digest();
//                                md.update(digestedData1);
                                byte[] digestedData2 = md.digest();
                                //签名原始数据,即原始内容的一次MD5值
                                byte[] content = (byte[])sign.getSignedContent().getContent();
                                System.out.println("验证数字签名成功2"+ new String(content,"gb2312"));
                                System.out.println("验证数字签名成功3"+sign.getSignedContent().getContent());
//                               String bresult = CommonUtil.isEqual(digestedData2,signer.getContentDigest());
//                                bresult = CommonUtil.isEqual(digestedData1,content,digestedData1.length);            
//                                CommonUtil.displayData(content);
//                                CommonUtil.displayData(digestedData1);
                               byte[] digestedData1 = md.digest();

                         } else {
                                verifyRet = false;
                         }
                  }
                  
           }
           catch (Exception e) {
                  verifyRet = false;
                  e.printStackTrace();
                  System.out.println("验证数字签名失败");
           }
           return verifyRet;
    }





后台输出结果 :

验证数字签名成功)?6?
%?4~@S?L9?
验证数字签名成功2a
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,