Crittografia XML
Con la diffusione della tecnologia XML , sempre più informazioni vengono distribuite in questo formato. Ma XML nasce come formato di documento e di per sé non contiene elementi legati alla sicurezza. Ciò rende necessario uno sforzo specifico in questa materia, nella ricerca di un metodo per proteggere queste informazioni condivise.
La crittografia XML è una raccomandazione del Web Consortium ( W3C ) che specifica un processo per crittografare i dati (non solo documenti XML ) e rappresentare le informazioni crittografate in XML mentre viaggiano sui mezzi di trasmissione. Questo articolo si propone di descrivere brevemente ed esemplificarne il funzionamento, per informazioni dettagliate consultare la Specifica Web Consortium.
Le gravi carenze di sicurezza di questa specifica sono state pubblicate. [ 1 ]
Aspetti generali
La crittografia XML stabilisce che per crittografare un elemento (o il contenuto testuale di un elemento), esso sarà sostituito da un altro elemento previsto dal disciplinare che conterrà i dati crittografati e le informazioni necessarie al trattamento, come l'identificazione del algoritmo utilizzato o dati sulla chiave utilizzata. Questo elemento è <EncryptedData>, in modo tale che possa apparire come la radice del nuovo documento generato dopo il processo, o come figlio di altri elementi preesistenti.
D'altra parte, la specifica stabilisce XML Schema come schema del modello di dati. Tale Schema è consultabile nella specifica XML Encryption ed è necessario conoscere la sintassi da utilizzare.
La versione corrente di Crittografia XML utilizza il seguente spazio dei nomi:
xmlns:xenc=' http://www.w3.org/2001/04/xmlenc#'
Granularità della crittografia dei documenti XML
La crittografia XML afferma che è possibile crittografare i dati a diversi livelli di granularità, da semplici elementi a interi documenti. Lo si vede facilmente con un esempio abbastanza intuitivo, ottenuto direttamente dal Web Consortium ( W3C ). Supponiamo di avere il seguente documento XML :
<?xml version='1.0'?>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<CreditCard Limit='5,000' Currency='USD'>
<Number>4019 2445 0277 5567</Number>
<Issuer>Example Bank</Issuer>
<Expiration>04/02</Expiration>
</CreditCard>
</PaymentInfo>
È un'informazione di pagamento che contiene dati su una carta di credito: un cliente di nome John Smith ha una carta di credito, il cui numero è 4019 2445 0277 5567, con un limite di 5.000 USD e una data di scadenza. Queste informazioni sono sensibili e dovrebbero essere protette.
Vediamo alcuni esempi di diversi livelli di crittografia per quel documento...
Crittografia di un elemento
Possiamo crittografare solo l'elemento <CreditCard> e lasciare intatto il nome del cliente, ottenendo quanto segue:
<?xml version='1.0'?>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<EncryptedData Type='http://www.w3.org/2001/04/xmlenc#Element'
xmlns='http://www.w3.org/2001/04/xmlenc#'>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
</PaymentInfo>
Crittografando completamente l'elemento <CreditCard>, compresi i suoi tag, l'identità dell'elemento rimane nascosta. Ciò offre un'interessante possibilità di sicurezza poiché, in linea di principio, il mezzo di pagamento non sarà noto fino a quando i dati non saranno decifrati.
Crittografia degli elementi figlio
Possiamo scegliere di non crittografare l'intero elemento <CreditCard> ma alcuni dati specifici: il numero, la banca e la data di scadenza.
<?xml version='1.0'?>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<CreditCard Limit='5,000' Currency='USD'>
<EncryptedData xmlns='http://www.w3.org/2001/04/xmlenc#'
Type='http://www.w3.org/2001/04/xmlenc#Content'>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
</CreditCard>
</PaymentInfo>
Ora vediamo che l'elemento <CreditCard> rimane visibile ma non i dati che volevamo nascondere.
Crittografia del contenuto testuale
Volendo proteggere solo il numero di carta di credito (ovvero il contenuto testuale dell'elemento <number>) otterremmo quanto segue:
<?xml version='1.0'?>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<CreditCard Limit='5,000' Currency='USD'>
<Number>
<EncryptedData xmlns='http://www.w3.org/2001/04/xmlenc#'
Type='http://www.w3.org/2001/04/xmlenc#Content'>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
</Number>
<Issuer>Example Bank</Issuer>
<Expiration>04/02</Expiration>
</CreditCard>
</PaymentInfo>
Vediamo che tutte le informazioni rimangono intatte ad eccezione del contenuto testuale dell'elemento <number> che conteneva i dati da proteggere.
Crittografia di interi documenti
Se tutte le informazioni devono essere protette, è possibile crittografare un intero documento XML . Se lo facciamo con il documento del nostro esempio, otteniamo quanto segue:
<?xml version='1.0'?>
<EncryptedData xmlns='http://www.w3.org/2001/04/xmlenc#'
MimeType='text/xml'>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
Ora, tutte le informazioni sono state crittografate.
Super-crittografia (crittografia dei dati precedentemente crittografati)
Poiché è possibile crittografare qualsiasi tipo di informazione, nulla ci impedisce di crittografare dati già crittografati. Questa è nota come Super-crittografia e può essere utilizzata purché venga rispettata la seguente limitazione: l'intero elemento <EncryptedData> deve essere crittografato.
La crittografia del contenuto testuale o dei suoi elementi figlio risulterebbe in un documento XML non valido rispetto allo schema definito dalla crittografia XML, poiché secondo questo schema un elemento <EncryptedData> non può essere padre o figlio di un altro elemento <EncryptedData>. Sarà quindi necessario tenere conto di questa limitazione quando si utilizza questa possibilità di doppia crittografia.
Sintassi della crittografia XML
Normalmente l'aspetto di un documento XML crittografato sarà molto più complesso di quanto visto negli esempi precedenti. Lo schema che modella tutta questa sintassi è relativamente ampio e copre molti aspetti relativi alla crittografia, utilizzando un insieme di elementi e attributi speciali.
Ad esempio, per conoscere il metodo di crittografia utilizzato, viene utilizzato l'elemento <EncryptionMethod>. Se questo elemento non esiste, il destinatario del messaggio crittografato deve sapere in anticipo quale algoritmo è stato utilizzato.
I dati crittografati stessi sono contenuti negli elementi <CipherData>, che rappresentano il contenuto in Base 64.
Anche la gestione delle chiavi ha una sua struttura, ma vengono utilizzate anche parti di XML Signature (un altro lavoro del W3C ). Ad esempio, una stringa di caratteri visibile può essere associata a una chiave segreta che solo il mittente e il destinatario conoscono in anticipo. Questa stringa è incorporata nell'elemento <KeyName> in modo che il destinatario sappia quale chiave utilizzare per decrittografare le informazioni (un modo interessante per evitare di inviare chiavi segrete su mezzi di comunicazione non sicuri).
Se invece scegliamo di inviare la chiave insieme al documento, sarà consigliato crittografarlo a nostra volta; l'elemento <EncryptedKey> viene utilizzato per trasportarlo nel documento. Questo ci aiuterà a poter inviare la chiave stessa insieme al documento in modo sicuro.
Esistono elementi e attributi più specifici che forniscono maggiori informazioni per l'elaborazione della crittografia XML. Tieni presente che, come accennato in precedenza, molti di questi metodi non appartengono alla stessa crittografia XML, ma alla firma XML.
Algoritmi riconosciuti
Poiché la crittografia XML coinvolge molti aspetti della crittografia e della sicurezza in generale, è stata effettuata una classificazione degli algoritmi riconosciuti e della loro missione nell'elaborazione.
Sono supportati vari algoritmi crittografici per la crittografia dei dati, inclusi TripleDES, AES e RSA. Ciascuno deve essere referenziato nel documento crittografato tramite un identificatore dedicato che è definito nella specifica.
Il trasporto delle chiavi (Key Transport) è responsabile degli algoritmi RSA-v1.5 e RSA-OAEP. La sua funzione è una crittografia asimmetrica (chiave pubblica) specificamente progettata per crittografare e decifrare le chiavi.
Per l'autenticazione dei messaggi (Message Authentication) il gruppo di lavoro consiglia di utilizzare la firma XML, un altro lavoro del Web Consortium.
I canoni dei documenti XML sono descritti in XML Canonical , un'opera del Web Consortium ( W3C ). Questo processo consiste nella serializzazione di un documento XML in un flusso di ottetti, un passaggio necessario per la crittografia.
Infine, si stabilisce che la codifica dei dati deve essere fatta in Base64.
Ci sono più algoritmi e metodi riconosciuti da XML Encryption rispetto a quelli qui menzionati... per conoscerli nel dettaglio bisogna andare alla specifica.
Implementazioni
Esistono diverse implementazioni che aderiscono all'attuale specifica di crittografia XML:
- XML Security Library, di Aleksey Sanin, distribuito sotto licenza MIT ( http://www.aleksey.com/xmlsec/ ).
- KeyTools XML, da Baltimora ( https://web.archive.org/web/20031204164338/http://www.baltimore.com/keytools/xml/ ).
- Phaos XML ( https://web.archive.org/web/20060907073156/http://www.phaos.com/products/category/xml.html ).
Riferimenti
- Un'introduzione alla crittografia XML e alla firma XML, Murdoch Mactaggart
- 1.0, W3C
- Crittografia XML, W3C
- Gestione delle chiavi XML, W3C
- Schema XML, W3C
- Firma XML, W3C
Questo articolo incorpora materiale da http://www.planetasilius.tk , che attraverso una versione di Wikipedia:Releases/ ha consentito l'aggiunta e la pubblicazione di contenuti sotto GFDL .