Firma digitale XML
Una firma digitale XML è una firma che può essere usata
in transazioni XML. Lo
standard definisce uno schema per il formato di una firma digitale
applicata su un dato in formato arbitrario (ma spesso XML).
Analogamente alle firme digitali non XML (come ad esempio quelle in
formato PKCS), le firme XML aggiungono al dato firmato le
caratteristiche di identificazione e di integrità.
Tuttavia, a differenza delle firme non XML, queste sono state
progettate
per trarre vantaggio delle caratteristiche dei protocolli Internet e
del linguaggio XML.
Una caratteristica fondamantale di una firma XML è la
capacità di poter firmare solo una porzione specifica
di un albero XML invece dell'intero documento. Questo può
risultare utile quando un documento XML ha una lunga storia nella quale
componenti diverse sono state aggiunte da autori diversi in tempi
diversi, e si abbia la necessità di firmare solo certi elementi
rilevanti. Questa flessibilità è anche critica in
situazioni dove sia importante assicurare l'integrità di certe
porzioni di un documento XML, lasciando aperta la possibilità di
effettuare modofiche su altre porzioni del documento. Si consideri, per
esempio,
un modulo XML firmato inviato ad un utente perchè lo completi.
Se la firma si estendesse sul modulo completo, ogni modifica
dell'utente invaliderebbe la firma originaria.
Una firma XML può essere applicata a più di un tipo di
dato.Per esempio, una singola firma XML può coprire dati HTML,
dati in formato JPG, dati in XML, e dati appartenenti ad una
sezione specifica di un
file XML.
Per la validazione di una firma è necessario che il dato
firmato sia accessibile. Il riferimento della locazione dell'oggetto
firmato è indicato nella firma XML stessa per mezzo di un
opportuno URI.
Di seguito sono elencati i passi necessari per creare una firma XML;
1. Determinare gli oggetti da firmare.
Questo significa identificare le risorse per mezzo del
corrispondente
Uniform Resource Identifier (URI).
- "http://www.abccompany.com/index.html" si riferisce a una pagina
HTML
- "http://www.abccompany.com/logo.gif" si riferisce a una immagine
GIF
- "http://www.abccompany.com/xml/po.xml" si riferisce a un
documento XML
- "http:/www.abccompany.com/xml/po.xml#sender1" si riferisce
a una sezione specifica all'interno di documento XML
2. Calcolare il digest di ogni oggetto.
In una firma XML, il riferimento ad ogni risorsa è
specificato per mezzo di un elemento
<Reference> ed il suo digest (calcolato sulla
risorsa associata e non sull'elemento <Reference>
stesso) viene posizionato all'interno di un elemento figlio <DigestValue>
come nel seguente esempio:
<Reference URI="http://www.abccompany.com/news/2000/03_27_00.htm">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</DigestValue>
</Reference>
<Reference
URI="http://www.w3.org/TR/2000/WD-xmldsig-core-20000228/signature-example.xml">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>UrXLDLBIta6skoV5/A8Q38GEw44=</DigestValue>
</Reference>
L'elemento <DigestMethod> identifica l'algoritmo
utilizzato per calcolare il digest.
3. Raccogliere gli elementi Reference
Gli elementi <Reference> (con i loro digest
associati) vengono raccolti all'interno di
un elemento <SignedInfo> come nell'esempio;
<SignedInfo Id="foobar">
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" />
<Reference URI="http://www.abccompany.com.com/news/2000/03_27_00.htm">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</DigestValue>
</Reference>
<Reference
URI="http://www.w3.org/TR/2000/WD-xmldsig-core-20000228/signature-example.xml">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>UrXLDLBIta6skoV5/A8Q38GEw44=</DigestValue>
</Reference>
</SignedInfo>
L'elemento <CanonicalizationMethod> indica
l'algoritmo usato per generare la forma canonica dell'elemento <SignedInfo>.
Diversi flussi di dati con la stessa informazione XML possono avere
diverse rappresentazioni testuali, come ad esempio contenere un numero
diverso di spazi. Per evitare che le verifiche risultino inaccurate,
l'informazione XML deve essere messa in una forma canonica prima di
estrarre la rappresentazione binaria per il processo di firma.
L'elemento <SignatureMethod>
identifica l'algoritmo usato per produrre il valore della firma.
4. Firmare
Viene calcolato il digest dell'elemento <SignedInfo>,
esso viene quindi criptato ed il risultato viene inserito in un
elemento
<SignatureValue>.
<SignatureValue>MC0E LE=</SignatureValue>
5. Aggiungere le informazioni sulla chiave
L'elemento <KeyInfo>
contiene le informazioni sulle chiavi.
Nell'esempio seguente
l'elemento contiene informazioni su un certificato X.509, che a sua
volta contiene la chiave pubblica necessaria per la verifica
della firma..
<KeyInfo>
<X509Data>
<X509SubjectName>CN=Ed Simon,O=XMLSec Inc.,ST=OTTAWA,C=CA</X509SubjectName>
<X509Certificate>MIID5jCCA0+gA...lVN</X509Certificate>
</X509Data>
</KeyInfo>
6. Generare l'elemento Signature
Gli elementi <SignedInfo>, <SignatureValue>,
e
<KeyInfo> vengono inseriti in un elemento <Signature>.
L'elemento <Signature> rappresenta la firma XML.
<?xml version="1.0" encoding="UTF-8"?>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo Id="foobar">
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" />
<Reference URI="http://www.abccompany.com/news/2000/03_27_00.htm">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</DigestValue>
</Reference>
<Reference
URI="http://www.w3.org/TR/2000/WD-xmldsig-core-20000228/signature-example.xml">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>UrXLDLBIta6skoV5/A8Q38GEw44=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>MC0E~LE=</SignatureValue>
<KeyInfo>
<X509Data>
<X509SubjectName>CN=Ed Simon,O=XMLSec Inc.,ST=OTTAWA,C=CA</X509SubjectName>
<X509Certificate>
MIID5jCCA0+gA...lVN
</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
Questi sono i passi necessari per verificare una firma XML:
-
Verificare la firma all'interno dell'elemento <SignedInfo>.
Per far ciò, è necessario ricalcolare il digest
dell'elemento <SignedInfo>
(usando l'algoritmo specificato nell'elemento <SignatureMethod>)
ed usare la chiave pubblica per verificare se valore dell'elemento <SignatureValue>
è corretto.
-
Se questo passo viene superato, è necessario ricalcolare
i digest degli elementi referenziati all'interno di <SignedInfo>
e paragonarli con i digest contenuti in ogni elemento <DigestValue>.