当前位置: 首页 > 知识库问答 >
问题:

javax。xml。加密。URIReferenceException:无法解析ID为Object的元素

宰父德馨
2023-03-14

我想通过以下方式在XML文件上进行数字签名

>

  • 使用SHA-256进行单向散列

    规范化方法算法="http://www.w3.org/2001/10/xmlexcc14n#"

    我遵循了这里提到的签名api!

    但我得到以下错误

    com。太阳组织。阿帕奇。xml。内部的安全UTIL。分解器。ResourceResolvexException:无法解析ID为object的元素

    我已经尝试了元素。“ID”的setIdAttributeNode以及setIdAttributeNS,但没有帮助

    下面一行是引发错误的地方

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    dbFactory.setNamespaceAware ( false );  
    Document doc = dbFactory.newDocumentBuilder().parse(new FileInputStream(filePath));
    
    String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI");
    
    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
    
    // Next, create a Reference to a same-document URI that is an Object element and specify the SHA256 digest algorithm
    DigestMethod digestMethod = fac.newDigestMethod(DigestMethod.SHA256, null);
    Reference reference = fac.newReference("#CBC",digestMethod);
    SignatureMethod signatureMethod = fac.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", null);
    CanonicalizationMethod canonicalizationMethod = fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, (C14NMethodParameterSpec) null);
    
    // Create the SignedInfo
    SignedInfo si = fac.newSignedInfo(canonicalizationMethod, signatureMethod, Collections.singletonList(reference));
    
    // Create a RSA KeyPair
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
    kpg.initialize(2048);
    KeyPair kp = kpg.generateKeyPair();
    
    // Create a KeyValue containing the RSA PublicKey that was generated
    KeyInfoFactory kif = fac.getKeyInfoFactory();
    KeyValue kv = kif.newKeyValue(kp.getPublic());
    
    // Create a KeyInfo and add the KeyValue to it
    KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv));
    DOMSignContext dsc = new DOMSignContext(kp.getPrivate(), doc);
    //dsc.setDefaultNamespacePrefix("dsig");
    
    // Create the XMLSignature and sign it
    XMLSignature signature = fac.newXMLSignature(si, ki,Collections.singletonList(obj), null, null);
    signature.sign(dsc);
    
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer trans = tf.newTransformer();
    
    

    错误发生在下一行

    signature.sign(dsc)
    
  • 共有1个答案

    琴光亮
    2023-03-14

    我添加了以下两行,解决了问题。

    XMLStructure content = new DOMStructure(doc.getDocumentElement());
    XMLObject obj = fac.newXMLObject(Collections.singletonList(content), "CBC", null, null);
    
     类似资料:
    • 问题内容: 我有一个正在下载xml并将其解析为sql数据库的应用程序。我的问题是,一旦部署了应用程序,xml中的数据就很容易被抓取,其他人可能将我辛苦赚来的数据用于自己的邪恶目的/应用程序。基本上我需要使用php加密xml,然后使用android解密。我已经看过几个php类,它们可以很容易地加密,但是我不完全确定哪种加密方法与android兼容。 解决后编辑: 起初,我认为出于某种原因我不得不忽略

    • 本文向大家介绍Python解析xml中dom元素的方法,包括了Python解析xml中dom元素的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python解析xml中dom元素的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

    • 我使用EclipseMars(M1)作为我的IDE。今天,我使用Apache Thrift 0.9.2(最新稳定版本)为Android项目生成了我的服务的Java代码。这个版本(unlke版本0.9.1)使用来自javax的“生成”注释。注释包,用于添加一些可提取的文档。它在每个生成的类之前添加一行,如下所示: @已生成(value=“节俭编译器自动生成(0.9.2)”,日期=“2014-11-3

    • 两天前,我犯了以下错误: 执行任务:[: app: assembleDebug] 配置项目:app registerResGeneratingTask已弃用,请使用registerGeneratedResFolders(FileCollection) 任务:app:buildInfoDebugLoader任务:app:preBuild-UP-DATE任务:core:preDebugBuild-up

    • 我得到的错误是:无法将java.lang.String实例反序列化出START_OBJECT令牌 如何将xml元素反序列化更正为基元类型?