java - [签名验证错误]:签名长度不正确:得到 780 但预期为 256
问题描述
要求 :
程序将有一个带有 3 个标签的 xml 文件作为输入: 和所有这些数据都是 Base64 编码的。程序需要对它们进行解码并使用签名和证书验证数据的真实性
已验证的数据应进行 Base64 解码。
签名验证
- 通过遍历对应的节点,从签名文件中提取出原始内容、签名数据和证书。
- 也使用 SHA256WITHRSA 创建签名对象。
- 调用签名验证方法,输入参数为签名数据、文件内容和从证书节点提取的公钥。
- 如果签名者验证方法返回 true,则获取原始文件内容
这是我验证签名的代码
public boolean signAndVerifyXmlDoc(File file) {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = null;
try {
docBuilder = docBuilderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document doc = null;
try {
String orgContent = "", splitData = "", signContent = "", certContent = "";
doc = docBuilder.parse(new FileInputStream(file));
doc.getDocumentElement().normalize();
NodeList originalContent = doc.getElementsByTagName("OrgContent");
Element originalElement = (Element) originalContent.item(0);
NodeList textOrgContent = originalElement.getChildNodes();
orgContent = ((Node) textOrgContent.item(0)).getNodeValue().trim();
NodeList signature = doc.getElementsByTagName("Signature");
Element signatureElement = (Element) signature.item(0);
NodeList signatureContent = signatureElement.getChildNodes();
signContent = ((Node) signatureContent.item(0)).getNodeValue().trim();
NodeList certificate = doc.getElementsByTagName("Certificate");
Element certificateElement = (Element) certificate.item(0);
NodeList certificateContent = certificateElement.getChildNodes();
certContent = ((Node) certificateContent.item(0)).getNodeValue().trim();
Signature sign = Signature.getInstance("SHA256WITHRSA");
sign.initVerify(getCertificateFromFile(certContent).getPublicKey());
sign.update(Base64.decode(orgContent));
byte[] signdDecode = Base64.decode(signContent);
boolean b = sign.verify(signdDecode);
return b;
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
return false;
}
因此,当我验证签名数据时出现异常。请帮助查找我缺少的内容?
解决方案
推荐阅读
- json - 如何在 Kotlin 的 JSON 中获取嵌套对象?
- c# - 如何根据提供我要绑定的属性名称的字符串属性绑定 TextBox.Text?
- c# - Control.Hide(); (WinForms) 等效于 Cocoa C# 项目
- node.js - 使用 webpack 进行 Sass 相对导入
- spring-batch - 使用 Spring 批处理读取 CSV 文件并根据第一个字段映射到域对象,然后将它们相应地插入 DB
- java - 部署到实例时,EJB Timer 服务不可用
- apache-spark - 使用 Spark 转换 Oracle RAW 类型
- css - 如何使用 safari 的媒体查询缩小和捆绑 css 代码
- laravel-5 - 错误 Collection::appends 不存在在使用映射的分页中
- c# - 如何从 Azure CosmosDb 中的 BsonType 'Binary' 反序列化 'ObjectId'?