XML/XML Encryption
- Conoscere le basi della crittografia XML
- Imparare la sintassi base per la crittografia XML
La crittografia XML è stata sviluppata per affrontare due comuni aspetti non previsti dal protocollo TLS/SSL (Transport Layer Security / Secure Socket Layer). TLS/SSL è un protocollo molto sicuro e affidabile che fornisce sessioni di sicurezza end-to-end tra due parti. XML aggiunge un ulteriore livello di sicurezza a TLS/SSL crittografando una parte o tutti i dati scambiati e consentendo sessioni sicure tra più di due parti. In altre parole, ogni parte può mantenere sessioni sicure o non sicure con una qualsiasi delle parti che comunicano, e i dati, sia sicuri che non sicuri, possono essere scambiati nello stesso documento. Inoltre, la crittografia XML è in grado di gestire sia dati XML sia non XML (ad esempio binari).
Sintassi
[modifica | modifica sorgente]Tutti i file XML crittografati devono iniziare con il preambolo, la dichiarazione, le entità interne e l'import
:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSchema 200102//EN"
"http://www.w3.org/2001/XMLSchema.dtd"
[
<!ATTLIST schema
xmlns:xenc CDATA #FIXED 'http://www.w3.org/2001/04/xmlenc#'
xmlns:ds CDATA #FIXED 'http://www.w3.org/2000/09/xmldsig#'>
<!ENTITY xenc 'http://www.w3.org/2001/04/xmlenc#'>
<!ENTITY % p ''>
<!ENTITY % s ''>
]>
<schema xmlns='http://www.w3.org/2001/XMLSchema' version='1.0'
xmlns:ds='http://www.w3.org/2000/09/xmldsig#'
xmlns:xenc='http://www.w3.org/2001/04/xmlenc#'
targetNamespace='http://www.w3.org/2001/04/xmlenc#'
elementFormDefault='qualified'>
<import namespace='http://www.w3.org/2000/09/xmldsig#'
schemaLocation='http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core- schema.xsd'/>
EncryptedType
[modifica | modifica sorgente]EncryptedType
è il tipo astratto da cui derivano EncryptedData
e EncryptedKey
.
<complexType name='EncryptedType' abstract='true'>
<sequence>
<element name='EncryptionMethod' type='xenc:EncryptionMethodType'
minOccurs='0'/>
<element ref='ds:KeyInfo' minOccurs='0'/>
<element ref='xenc:CipherData'/>
<element ref='xenc:EncryptionProperties' minOccurs='0'/>
</sequence>
<attribute name='Id' type='ID' use='optional'/>
<attribute name='Type' type='anyURI' use='optional'/>
<attribute name='MimeType' type='string' use='optional'/>
<attribute name='Encoding' type='anyURI' use='optional'/>
</complexType>
<syntaxhighlight lang="XML">
<code>EncryptionMethod</code> è un elemento facoltativo che descrive l'algoritmo di crittografia applicato ai dati criptati. Se l'elemento è assente, l'algoritmo deve essere noto al destinatario o la decriptazione avrà esito negativo.
<syntaxhighlight lang="XML">
<element name='EncryptionMethod' type='xenc:EncryptionMethodType'
minOccurs='0'/>
ds:KeyInfo
è un elemento facoltativo che contiene informazioni sulla chiave utilizzata per crittografare i dati. Le sezioni successive di questa specifica definiscono nuovi elementi che possono essere visualizzati come elementi figlio di ds:KeyInfo
.
<element ref='ds:KeyInfo' minOccurs='0'/>
CipherData
è un elemento obbligatorio che contiene il CipherValue
o CipherReference
con i dati criptati.
<element ref='xenc:CipherData'/>
EncryptionProperties
può contenere informazioni aggiuntive sulla generazione di EncryptedType
(ad esempio: data e ora).
<element ref='xenc:EncryptionProperties' minOccurs='0'/>
Id
è un attributo facoltativo che fornisce il metodo standard di assegnazione di un stringa ID all'elemento all'interno del contesto del documento.
<attribute name='Id' type='ID' use='optional'/>
Type
è un attributo facoltativo che identifica le informazioni sul tipo sul modulo in testo non crittografato del contenuto crittografato. Sebbene facoltativa, questa specifica ne trae vantaggio per l'elaborazione obbligatoria in dycryption. Se l'elemento EncryptedData contiene dati di tipo 'elemento' o elemento 'content' e sostituisce tali dati in un contesto di documento XML, è consigliabile fornire l'attributo Type. Senza queste informazioni, il decryptor non sarà in grado di ripristinare automaticamente il documento XML nel formato non crittografato originale.
<attribute name='Type' type='anyURI' use='optional'/>
MimeType
è un attributo facoltativo che descrive il tipo dei dati che sono stati crittografati. Il valore di questo attributo è una stringa con valori definiti da [MIME]. Ad esempio, se i dati crittografati sono un file PNG codificato in base 64, la codifica di trasferimento può essere specificata come http://www.w3.org/2000/09/xmldsig#base64
e MimeType
come image/png
. Questo attributo è puramente informativo, non richiede alcuna convalida delle informazioni MimeType
e non indica che l'applicazione di crittografia deve eseguire ulteriori elaborazioni. Si noti che queste informazioni potrebbero non essere necessarie se sono già associate all'identificatore nell'attributo Type
. Ad esempio, i tipi Element
e Content
definiti in questa specifica sono sempre testo con codifica UTF-8.
<attribute name='MimeType' type='string' use='optional'/>
EncryptionMethod
[modifica | modifica sorgente]EncryptionMethod
è un elemento facoltativo che descrive l'algoritmo di crittografia applicato ai dati di crittografia. Se l'elemento è assente, l'algoritmo di crittografia deve essere noto al destinatario o la decriptazione avrà esito negativo. Gli elementi figlio consentiti di EncryptionMethod
sono determinati dal valore specifico dell'URI dell'attributo Algorithm
.
<complexType name='EncryptionMethodType' mixed='true'>
<sequence>
<element name='KeySize' minOccurs='0' type='xenc:KeySizeType'/>
<element name='OAEPparams' minOccurs='0' type='base64Binary'/>
<any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
</sequence>
<attribute name='Algorithm' type='anyURI' use='required'/>
</complexType>
CipherData
[modifica | modifica sorgente]CipherData
è un elemento obbligatorio che fornisce i dati crittografati. Deve contenere la sequenza crittografata di ottetti dell'elemento CipherValue
come testo codificato in base 64, oppure fornire un riferimento a una posizione esterna contenente la sequenza di ottetti crittografata tramite l'elemento CipherReference
.
<element name='CipherData' type='xenc:CipherDataType'/>
<complexType name='CipherDataType'>
<choice>
<element name='CipherValue' type='base64Binary'/>
<element ref='xenc:CipherReference'/>
</choice>
</complexType>
CipherReference
[modifica | modifica sorgente]CipherReference
identifica un sorgente che, una volta elaborato, produce la sequenza di ottetti crittografati CipherReference
, che viene utilizzata quando CipherValue
non viene fornito direttamente. Il valore effettivo viene ottenuto come indicato di seguito. L'URI CipherReference
contiene un identificatore dereferenziato. Se l'elemento CipherReference
contiene una sequenza opzionale di trasformazioni, i dati risultanti dalla dereferenziazione dell'URI vengono trasformati come specificato, in modo da restituire il valore di crittografia previsto. Ad esempio, se il valore è codificato in base 64 all'interno di un documento XML, le trasformazioni potrebbero specificare un'espressione XPath seguita da una decodifica a base 64 in modo da estrarre gli ottetti.
<element name='CipherReference' type='xenc:CipherReferenceType'/>
<complexType name='CipherReferenceType'>
<sequence>
<element name='Transforms' type='xenc:TransformsType' minOccurs='0'/>
</sequence>
<attribute name='URI' type='anyURI' use='required'/>
</complexType>
<complexType name='TransformsType'>
<sequence>
<element ref='ds:Transform' maxOccurs='unbounded'/>
</sequence>
</complexType>
<syntaxhighlight>
Riferimento di crittografia con funzione Tranform opzionale e algoritmo tranform:
<syntaxhighlight lang="XML">
<CipherReference URI="http://www.example.com/CipherValues.xml">
<Transforms>
<ds:Transform
Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath xmlns:rep="http://www.example.org/repository">
self::text()[parent::rep:CipherValue[@Id="example1"]]
</ds:XPath>
</ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#base64"/>
</Transforms>
</CipherReference>
EncryptedData
[modifica | modifica sorgente]EncryptedData
è l'elemento principale nella sintassi. Non solo il suo elemento figlio CipherData
contiene i dati crittografati, ma è anche l'elemento che sostituisce l'elemento crittografato o funge da nuova radice del documento.
<element name='EncryptedData' type='xenc:EncryptedDataType'/>
<complexType name='EncryptedDataType'>
<complexContent>
<extension base='xenc:EncryptedType'>
</extension>
</complexContent>
</complexType>