XML-Verschlüsselung

Die XML-Verschlüsselung ist eine Spezifikation, die vom World Wide Web (WWW) Consortium (W3C) im Jahr 2002 entwickelt wurde und die erforderlichen Schritte zum Verschlüsseln von Daten, zum Entschlüsseln von Daten, die XML-Syntax für die Darstellung verschlüsselter Daten, die zum Entschlüsseln der Daten verwendeten Informationen und eine Liste von Verschlüsselungsalgorithmen wie Triple DES, AES und RSA beschreibt.

Sie können die XML-Verschlüsselung auf ein XML-Element, den Inhalt eines XML-Elements und beliebige Daten einschließlich XML-Dokumente anwenden. Nehmen wir zum Beispiel an, Sie möchten das in Beispiel 1 gezeigte Element „ <CreditCard> “ verschlüsseln.

Beispiel 1: XML-Beispieldokument:

<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>

Beispiel 2: XML-Dokument mit einem gemeinsamen geheimen Schlüssel:

Beispiel 2 zeigt das XML-Dokument nach Verschlüsselung. Das Element „ <EncryptedData> “ steht für das verschlüsselte Element „ <CreditCard> “. Das Element „ <EncryptionMethod> “ beschreibt den verwendeten Verschlüsselungsalgorithmus, in diesem Beispiel Triple DES. Das Element „ <KeyInfo> “ enthält die Informationen, die zum Abrufen eines Entschlüsselungsschlüssels benötigt werden; in diesem Beispiel handelt es sich dabei um das Element „ <KeyName> “. Das Element „ <CipherValue> “ enthält den Chiffretext, der durch Serialisierung und Verschlüsselung des Elements „ <CreditCard> “ entsteht.

<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#'>
    <EncryptionMethod
       Algorithm='http://www.w3.org/2001/04/xmlenc#tripledes-cbc'/>
       <KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
         <KeyName>John Smith</KeyName>
       </KeyInfo>
       <CipherData>
         <CipherValue>ydUNqHkMrD...</CipherValue>
       </CipherData>
  </EncryptedData>
</PaymentInfo>

Beispiel 3: Ein XML-Dokument, das mit dem öffentlichen Schlüssel des Empfängers verschlüsselt wird:

In Beispiel 2 wird davon ausgegangen, dass Sender und Empfänger einen gemeinsamen geheimen Schlüssel (Secret Key) haben. Verfügt der Empfänger über ein Paar aus öffentlichem und privatem Schlüssel, was in der Regel der Fall ist, kann das Element „ <CreditCard> “ wie in Beispiel 3 gezeigt verschlüsselt werden. Das Element „ <EncryptedData> “ entspricht dem Element „ <EncryptedData> “ aus Beispiel 2. Das Element „ <KeyInfo> “ enthält jedoch ein Element „ <EncryptedKey> “.

<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#'>
    <EncryptionMethod
      Algorithm='http://www.w3.org/2001/04/xmlenc#tripledes-cbc'/>
    <KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
      <EncryptedKey xmlns='http://www.w3.org/2001/04/xmlenc#'>
        <EncryptionMethod 
          Algorithm='http://www.w3.org/2001/04/xmlenc#rsa-1_5'/>
        <KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
          <KeyName>Sally Doe</KeyName>
        </KeyInfo>
        <CipherData>
          <CipherValue>yMTEyOTA1M...</CipherValue>
        </CipherData>
      </EncryptedKey>
    </KeyInfo>
    <CipherData>
      <CipherValue>ydUNqHkMrD...</CipherValue>
    </CipherData>
  </EncryptedData>
</PaymentInfo>

XML-Verschlüsselung gemäß WSS-Core:

Die Spezifikation WSS-Core wird von der Organization for the Advancement of Structured Information Standards (OASIS) entwickelt. Die Spezifikation beschreibt Erweiterungen für SOAP-Messaging, die durch Nachrichtenintegrität, Nachrichtenvertraulichkeit und Authentifizierung jeder Nachricht einen besseren Schutz bieten. Die Vertraulichkeit von Nachrichten wird durch Verschlüsselung gemäß XML-Verschlüsselung realisiert.

Gemäß der Spezifikation WSS-Core ist die Verschlüsselung jeder Kombination von Teilen des Nachrichtenhauptteils (Body), Headerblöcken, ihren Unterstrukturen und Anhängen einer SOAP-Nachricht zulässig. Außerdem fordert die Spezifikation, dass bei der Verschlüsselung von Teilen einer SOAP-Nachricht den verschlüsselten Teilen der Nachricht eine Referenz aus dem Sicherheitsheader vorangestellt werden muss. Die Referenz kann dem Empfänger einen Hinweis darauf geben, welche verschlüsselten Teile der Nachricht zu entschlüsseln sind.

Die XML-Syntax der Referenz basiert auf den Informationen, die verschlüsselt werden, und der Art der Verschlüsselung. Nehmen wir beispielsweise an, dass das Element „ <CreditCard> “ in Beispiel 4 entweder mit einem gemeinsamen geheimen Schlüssel oder mit dem öffentlichen Schlüssel des Empfängers verschlüsselt ist.

Beispiel 4: Beispielnachricht der SOAP Version 1.1:

<SOAP-ENV:Envelope
  SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'
  xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
  <SOAP-ENV:Body>
    <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>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP Version 1.2 unterstützt encodingStyle nicht, deshalb ändert sich das Beispiel wie folgt:
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
  <SOAP-ENV:Body>
    <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>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Die daraus resultierenden SOAP-Nachrichten sind in den Beispielen 5 und 6 dargestellt. In diesen Beispielen dienen die Elemente „ <ReferenceList> “ und „ <EncryptedKey> “ jeweils als Referenz.

Beispiel 5: Eine SOAP-Nachricht der Version 1.1, die mit einem gemeinsamen geheimen Schlüssel verschlüsselt ist

<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
  <SOAP-ENV:Header>
    <Security SOAP-ENV:mustUnderstand='1'
      xmlns='http://schemas.xmlsoap.org/ws/2003/06/secext'>
      <ReferenceList xmlns='http://www.w3.org/2001/04/xmlenc#'>
        <DataReference URI='#ed1'/>
      </ReferenceList>
    </Security>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <PaymentInfo xmlns='http://example.org/paymentv2'>
      <Name>John Smith</Name>
      <EncryptedData Id='ed1'
        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#tripledes-cbc'/>
        <KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
          <KeyName>John Smith</KeyName>
        </KeyInfo>
        <CipherData>
          <CipherValue>ydUNqHkMrD...</CipherValue>
        </CipherData>
      </EncryptedData>
    </PaymentInfo>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP Version 1.2 unterstützt encodingStyle nicht, deshalb ändert sich das Beispiel wie folgt:

<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
  <SOAP-ENV:Header>
    <Security SOAP-ENV:mustUnderstand='1'
      xmlns='http://schemas.xmlsoap.org/ws/2003/06/secext'>
      <ReferenceList xmlns='http://www.w3.org/2001/04/xmlenc#'>
        <DataReference URI='#ed1'/>
      </ReferenceList>
    </Security>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <PaymentInfo xmlns='http://example.org/paymentv2'>
      <Name>John Smith</Name>
      <EncryptedData Id='ed1'
        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#tripledes-cbc'/>
        <KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
          <KeyName>John Smith</KeyName>
        </KeyInfo>
        <CipherData>
          <CipherValue>ydUNqHkMrD...</CipherValue>
        </CipherData>
      </EncryptedData>
    </PaymentInfo>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Beispiel 6: Eine SOAP-Nachricht, die mit dem öffentlichen Schlüssel des Empfängers verschlüsselt ist:

<SOAP-ENV:Envelope
  SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'
  xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
  <SOAP-ENV:Header>
    <Security SOAP-ENV:mustUnderstand='1'
      xmlns='http://schemas.xmlsoap.org/ws/2003/06/secext'>
      <EncryptedKey xmlns='http://www.w3.org/2001/04/xmlenc#'>
        <EncryptionMethod 
          Algorithm='http://www.w3.org/2001/04/xmlenc#rsa-1_5'/>
        <KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
          <KeyName>Sally Doe</KeyName>
        </KeyInfo>
        <CipherData>
          <CipherValue>yMTEyOTA1M...</CipherValue>
        </CipherData>
        <ReferenceList>
          <DataReference URI='#ed1'/>
        </ReferenceList>
      </EncryptedKey>
    </Security>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <PaymentInfo xmlns='http://example.org/paymentv2'>
      <Name>John Smith</Name>
      <EncryptedData Id='ed1'
        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#tripledes-cbc'/>
        <CipherData>
          <CipherValue>ydUNqHkMrD...</CipherValue>
        </CipherData>
      </EncryptedData>
    </PaymentInfo>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP Version 1.2 unterstützt encodingStyle nicht, deshalb ändert sich das Beispiel wie folgt:

<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
  <SOAP-ENV:Header>
    <Security SOAP-ENV:mustUnderstand='1'
      xmlns='http://schemas.xmlsoap.org/ws/2003/06/secext'>
      <EncryptedKey xmlns='http://www.w3.org/2001/04/xmlenc#'>
        <EncryptionMethod 
          Algorithm='http://www.w3.org/2001/04/xmlenc#rsa-1_5'/>
        <KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
          <KeyName>Sally Doe</KeyName>
        </KeyInfo>
        <CipherData>
          <CipherValue>yMTEyOTA1M...</CipherValue>
        </CipherData>
        <ReferenceList>
          <DataReference URI='#ed1'/>
        </ReferenceList>
      </EncryptedKey>
    </Security>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <PaymentInfo xmlns='http://example.org/paymentv2'>
      <Name>John Smith</Name>
      <EncryptedData Id='ed1'
        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#tripledes-cbc'/>
        <CipherData>
          <CipherValue>ydUNqHkMrD...</CipherValue>
        </CipherData>
      </EncryptedData>
    </PaymentInfo>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Beziehung zur digitalen Signatur:

Die Spezifikation WSS-Core unterstützt auch die Nachrichtenintegrität, die über eine digitale Signatur gemäß der XML-Signaturspezifikation realisiert wird.

Die Kombination von Verschlüsselung und digitaler Signatur für gemeinsame Daten führt zu einer Schwachstelle bei der Verschlüsselung.

Symmetrische Verschlüsselung und asymmetrische Verschlüsselung im Vergleich

Für die XML-Verschlüsselung unterstützt der Anwendungsserver zwei Typen von Verschlüsselung:

  • Symmetrische Verschlüsselung

    In Versionen des Anwendungsservers vor „ WebSphere® Application Server “ Version 7, einschließlich „ IBM® “ WebSphere Application Server Version 6.1 Feature Pack for Web Services, wurde standardmäßig die Referenz „ KeyName “ verwendet, um auf den gemeinsamen Schlüssel außerhalb der SOAP-Nachricht zu verweisen. Der Standard Web Services Security (WS-Security) Version 1.1 empfiehlt die Verwendung der Referenz "KeyName" jedoch nicht. Da das Element "KeyName" von der Sicherheitsrichtlinie nicht unterstützt wird, wird es auch im Anwendungsserver nicht unterstützt.

    Der Standard Web Services Secure Conversation (WS-SecureConversation) definiert, wie der gemeinsam genutzte Schlüssel zwischen Client und Service ausgetaucht wird und wie auf den gemeinsam genutzten Schlüssel in der Nachricht verwiesen wird. Die im Kerberos-Tokenprofil beschriebene Verwendung von Kerberos zusammen mit Web Services Security definiert, wie ein Kerberos-Sitzungsschlüssel oder ein aus dem Sitzungsschlüssel abgeleiteter Schlüssel zur Ausführung einer symmetrischen Verschlüsselung eingesetzt wird. Daher können Sie die symmetrische Verschlüsselung einsetzen, indem Sie WS-SecureConversation oder Kerberos verwenden. WebSphere Application Server unterstützt „ DerivedKeyToken “, wenn „ WS-SecureConversation “ verwendet wird. Bei Verwendung von „ Kerberos “ unterstützt „ WebSphere Application Server “ sowohl die Verwendung von „ DerivedKeyToken “ als auch die direkte Verwendung des Sitzungsschlüssels „ Kerberos “.

  • Asymmetrische Verschlüsselung

    Für die asymmetrische Verschlüsselung führt die Spezifikation "XML Encryption" das Konzept des Key Wrapping ein. Die Daten, wie z. B. der Inhalt des SOAP-Elements "body" (Hauptteil), werden mit einem gemeinsam genutzten Schlüssel verschlüsselt, der während der Verarbeitung dynamisch generiert wird. Anschließend wird der generierte gemeinsam genutzte Schlüssel mit dem öffentlichen Schlüssel des Empfängers verschlüsselt. WebSphere Application Server unterstützt das „ X509Token “ für asymmetrische Verschlüsselung.