Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

XML Signatures

XML Signatures: autenticare con sicurezza un documento XML
XML Signatures: autenticare con sicurezza un documento XML
Link copiato negli appunti

Quando si parla di sicurezza dei dati, assume un ruolo importante anche il problema dell'autenticazione e dell'integrità dei documenti, oltre a quello della loro segretezza. Autenticare un documento significa poter determinare in maniera esatta l'identità di chi lo ha inviato; mentre controllare l'integrità di un documento significa verificare che non abbia subito alterazioni durante il trasporto.

Per autenticare un documento si ricorre alla tecnica della Digital Signature (firma digitale), tramite la quale si ha la possibilità di firmare un documento utilizzando un algoritmo di crittografia a chiave pubblica. In particolare, la firma digitale viene realizzata utilizzando la chiave privata di colui che vuole inviare il documento. In questo modo si è sicuri dell'identità di chi ha firmato il documento perchè la firma digitale può essere decifrata solamente utilizzando la sua chiave pubblica.

Per creare la firma digitale non viene cifrato il documento ma il suo digest (sintesi), detto anche hash. Questo viene prodotto da un particolare algoritmo che, ricevendo in input il documento, è in grado di produrne una sintesi, una sorta di "impronta" che lo identifica in maniera univoca. Questa funzione è molto sensibile ad ogni minimo cambiamento del documento e quindi differenti versioni del documento produrranno digest diversi.

Il digest è quindi utilizzato per verificare l'integrità del documento. Infatti, una volta decodificata la firma digitale, abbiamo a disposizione il digest del documento che è stato spedito; confrontandolo con il digest calcolato sul documento ricevuto, possiamo stabilire se il documento ha subito delle alterazioni o no.

Tutti questi concetti li ritroviamo all'interno di XML Signature, la tecnologia che permette di "firmare" documenti XML o parti di essi, garantendone l'autenticità e l'integrità.

Per creare la firma digitale di un documento XML viene utilizzato il suo digest. Abbiamo detto che la funzione utilizzata per calcolarne il valore è molto sensibile alle variazioni del documento e quindi al fine di garantire il corretto funzionamento del meccanismo della firma digitale, il digest deve essere generato utilizzando la forma canonica del documento XML.

Vediamo adesso come utilizzare XML Signature per autentificare e garantire l'integrità di un documento d'esempio, identificato dall'URI http://nome_di_un_dominio/esempio.xml.

La XML Signature del documento d'esempio è la seguente:

<?xml version="1.0"?>
<Signature xmlns="http://www.w3.org/2000/09/xmldisg#">
  <SignedInfo Id="esempio_firma">
    <CanonicalizationMethod Algorithm="http://www.w3.org/tr/2001/REC-xml-c14n-20010315"/>
    <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldisg#dsa-sha1"/>
    <Reference URI="http://nome_di_un_dominio/esempio.xml">
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
      <DigestValue>j4fdsu4325riwjerfow732ewjdp9</DigestValue>
    </Reference>
  </SignedInfo>
  <SignatureValue>ME4324W</SignatureValue>
  <KeyInfo>
    <DSAKeyValue>
      <P>...</P><Q>...</Q><G>...</G><Y>...</Y>
    </DSAKeyValue>
  </KeyInfo>
</Signature>

La firma è contenuta all'interno dell'elemento <Signature> costituito da tre elementi principali: <SignedInfo>, <SignatureValue> e <KeyInfo>.

Il primo elemento (<SignedInfo>) racchiude le informazioni su come è stata generata la firma: l'algoritmo utilizzato per ottenere la forma canonica XML, l'algoritmo utilizzato per produrre la firma e le informazioni sulla risorsa firmata. Queste ultime sono specificate all'interno dell'elemento <Reference> e riguardano l'URI del documento XML, l'algoritmo utilizzato per calcolarne il digest e il valore del digest stesso.

L'elemento <SignatureValue> contiene il valore della firma digitale ottenuta secondo l'algoritmo indicato nell'elemento precedente.

L'ultimo elemento (<KeyInfo>) contiene le informazioni sulla chiave pubblica di chi ha firmato il documento XML e viene utilizzata per decifrare la firma digitale XML nella fase di verifica dell'autenticità e dell'integrità del documento. In questo caso al suo interno è presente l'elemento <DSAKeyValue> che contiene il valore della chiave pubblica secondo l'algoritmo DSA.

Il documento firmato potrebbe contenere al suo interno dei dati cifrati e questo potrebbe causare delle difficoltà in fase di verifica della firma digitale. Per ovviare a questo problema è possibile utilizzare l'elemento <transforms> all'interno di <Reference>.

In questo elemento è possibile specificare alcune trasformazioni che il verificatore della firma digitale deve compiere prima dell'operazione di verifica.

Consideriamo il seguente esempio:

<?xml version="1.0"?>
<acquirente id="acq1">
  <nome>Mario Rossi</nome>
  <carta_di_credito>    
    <EncryptedData Id="num_cart" Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#">
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldisg#">
        <ds:KeyName>M_Rossi</ds:KeyName>
      </ds:KeyInfo>
      <CipherData>
        <CipherValue>A55BDBC11</CipherValue>
      </CipherData>
    </EncryptedData>
    <scadenza>12/2003</scadenza>
  </carta_di_credito>
</acquirente>

La firma digitale dell'elemento <acquirente>, contenente un elemento cifrato, è:

<?xml version="1.0"?>
<Signature xmlns="http://www.w3.org/2000/09/xmldisg#">
  <SignedInfo Id="esempio_firma">
    <CanonicalizationMethod Algorithm="http://www.w3.org/tr/2001/REC-xml-c14n-20010315"/>
    <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldisg#dsa-sha1"/>
    <Reference URI="http://nome_di_un_dominio/esempio2.xml#acq1">
      <transforms>
        <transform Algorithm="http://www.w3.org/2001/04/xmlenc#decryption">
          <DataReference URI="http://nome_di_un_dominio/esempio2.xml#num_cart" xmlns="http://www.w3.org/2001/04/xmlenc#"/>
        </transform>
        <transform Algorithm="http://www.w3.org/tr/2000/CR-xml-c14n-20001026"/>
      </transforms>
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
      <DigestValue>j4fdsu4325riwjerfow732ewjdp9</DigestValue>
    </Reference>
  </SignedInfo>
  <SignatureValue>ME4324W</SignatureValue>
  <KeyInfo>
    <DSAKeyValue>
      <P>...</P><Q>...</Q><G>...</G><Y>...</Y>
    </DSAKeyValue>
  </KeyInfo>
</Signature>

In questo caso il verificatore della firma digitale deve effettuare due trasformazioni prima di poter correttamente controllare la firma: con la prima trasformazione viene decifrato l'elemento indicato da <DataReference> e successivante, con la seconda trasformazione, l'elemento viene posto in forma canonica.

Come al solito vi suggerisco di approfondire la panoramica introduttiva fatta in questo capitolo ando a leggere la specifica di XML Signatures all'indirizzo: http://www.w3.org/tr/xmldsig-core/.

Ti consigliamo anche