签名数据后台解析的时候,总是有问题,大神们帮看看
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 开发