Ho un documento XML come questo:
<?xml version="1.0" encoding="utf-8"?><root><a>1</a></root>
Firmo questo documento utilizzando una libreria DLL, fornita dal provider di crittografia, e ottengo un documento come questo:
<?xml version="1.0" encoding="utf-8"?><root><a>1</a>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha1"/>
<ds:Reference>
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#sha1"/>
<ds:DigestValue>...</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>...</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>...</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</root>
Dopodiché, linearizzo questa firma:
<?xml version="1.0" encoding="utf-8"?><root><a>1</a><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha1"/><ds:Reference><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#sha1"/><ds:DigestValue>...</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>...</ds:SignatureValue><ds:KeyInfo><ds:X509Data><ds:X509Certificate>...</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature></root>
Il terzo documento dovrebbe essere valido?
Ho una discussione con un fornitore di servizi che rifiuta di verificare i miei documenti se li linearizzo dopo firma. Tuttavia, afaik, tutti gli algoritmi devono canonicalizzare XML prima di firmare, eseguire hashing o verificare, in modo che i documenti logicamente equivalenti abbiano lo stesso hash / firma.
Allo stesso tempo, il loro sviluppatore mi dice che il suo vero, ma gli spazi bianchi strutturali non vengono rimossi durante c14n, vale a dire che gli spazi bianchi fuori dai tag vengono mantenuti e inclusi nei calcoli hash.
Chi ha ragione?
Il problema principale è che sto utilizzando IBM WebSphere Integration Bus che linearizza automaticamente qualsiasi XML e non c'è modo di disabilitare questa funzionalità. Il supporto IBM dice a "che il tuo codice non dovrebbe mai basarsi sulla struttura XML, l'XML riguarda i dati, non il testo, non è un nostro problema, se il tuo codice non funziona dopo la linearizzazione ecc."