Zum Hauptinhalt springen

2. Signaturalgorithmen

  1. Signaturalgorithmen

Abschnitt 8.1 von [RFC9052] enthält eine allgemeine Beschreibung von Signaturalgorithmen. Dieses Dokument definiert Signaturalgorithmus-Identifikatoren für zwei Signaturalgorithmen.

2.1. ECDSA

Der Elliptic Curve Digital Signature Algorithm (ECDSA) [DSS] definiert einen Signaturalgorithmus unter Verwendung von Elliptic Curve Cryptography (ECC). Implementierungen SOLLTEN eine deterministische Version von ECDSA verwenden, wie sie in [RFC6979] definiert ist. Die Verwendung eines deterministischen Signaturalgorithmus ermöglicht es Systemen, sich nicht auf Zufallszahlengeneratoren verlassen zu müssen, um die Generierung desselben Wertes von "k" (der Zufallswert pro Nachricht) zu vermeiden. Eine voreingenommene Generierung des Wertes "k" kann angegriffen werden, und Kollisionen dieses Wertes führen zu durchgesickerten Schlüsseln. Es ermöglicht zusätzlich die Durchführung deterministischer Tests für den Signaturalgorithmus. Die Verwendung von deterministischem ECDSA verringert nicht die Notwendigkeit einer guten Zufallszahlengenerierung bei der Erstellung des privaten Schlüssels.

Der ECDSA-Signaturalgorithmus wird mit einer Hash-Funktion (h) parametrisiert. Falls die Länge der Hash-Funktionsausgabe größer als die Gruppe des Schlüssels ist, werden die linkesten Bytes der Hash-Ausgabe verwendet.

Die in diesem Dokument definierten Algorithmen finden Sie in Tabelle 1.

          +=======+=======+=========+==================+
| Name | Value | Hash | Description |
+=======+=======+=========+==================+
| ES256 | -7 | SHA-256 | ECDSA w/ SHA-256 |
+-------+-------+---------+------------------+
| ES384 | -35 | SHA-384 | ECDSA w/ SHA-384 |
+-------+-------+---------+------------------+
| ES512 | -36 | SHA-512 | ECDSA w/ SHA-512 |
+-------+-------+---------+------------------+

Tabelle 1: ECDSA-Algorithmuswerte

Dieses Dokument definiert ECDSA so, dass es nur mit den Kurven P-256, P-384 und P-521 funktioniert. Dieses Dokument erfordert, dass die Kurven unter Verwendung des Schlüsseltyps "EC2" (zwei Koordinaten elliptische Kurve) codiert werden. Implementierungen müssen überprüfen, ob der Schlüsseltyp und die Kurve korrekt sind, wenn eine Signatur erstellt und überprüft wird. Zukünftige Dokumente können definieren, dass es in Zukunft mit anderen Kurven und Schlüsseltypen funktioniert.

Um die Interoperabilität zu fördern, wird vorgeschlagen, dass SHA-256 nur mit der Kurve P-256, SHA-384 nur mit der Kurve P-384 und SHA-512 nur mit der Kurve P-521 verwendet wird. Dies steht im Einklang mit der Empfehlung in Abschnitt 4 von [RFC5480].

Der Signaturalgorithmus ergibt ein Paar ganzer Zahlen (R, S). Diese ganzen Zahlen haben die gleiche Länge wie die Länge des für den Signaturprozess verwendeten Schlüssels. Die Signatur wird codiert, indem die ganzen Zahlen in Byte-Strings derselben Länge wie die Schlüsselgröße konvertiert werden. Die Länge wird auf das nächste Byte aufgerundet und mit Nullbits links aufgefüllt, um die richtige Länge zu erhalten. Die beiden ganzen Zahlen werden dann miteinander verkettet, um einen Byte-String zu bilden, der die resultierende Signatur ist.

Unter Verwendung der in [RFC8017] definierten Funktion ist die Signatur:

Signature = I2OSP(R, n) | I2OSP(S, n)

wobei n = ceiling(key_length / 8)

Bei Verwendung eines COSE-Schlüssels für diesen Algorithmus werden folgende Prüfungen durchgeführt:

  • Das Feld "kty" MUSS vorhanden sein und es MUSS "EC2" sein.

  • Wenn das Feld "alg" vorhanden ist, MUSS es mit dem verwendeten ECDSA-Signaturalgorithmus übereinstimmen.

  • Wenn das Feld "key_ops" vorhanden ist, MUSS es "sign" enthalten, wenn eine ECDSA-Signatur erstellt wird.

  • Wenn das Feld "key_ops" vorhanden ist, MUSS es "verify" enthalten, wenn eine ECDSA-Signatur überprüft wird.

2.1.1. Sicherheitsüberlegungen für ECDSA

Die Sicherheitsstärke der Signatur ist nicht größer als das Minimum der Sicherheitsstärke, die mit der Bitlänge des Schlüssels verbunden ist, und der Sicherheitsstärke der Hash-Funktion.

Hinweis: Die Verwendung einer deterministischen Signaturtechnik ist eine gute Idee, auch wenn eine gute Zufallszahlengenerierung vorhanden ist. Dies reduziert sowohl die Möglichkeit, denselben Wert von "k" in zwei Signaturoperationen zu haben, als auch ermöglicht es reproduzierbare Signaturwerte, was das Testen erleichtert. Kürzlich gab es Angriffe, bei denen das Gerät gestört wurde, um den Schlüssel zu extrahieren. Dies kann durch die Kombination von Zufälligkeit und Determinismus angegangen werden [CFRG-DET-SIGS].

Es gibt zwei Substitutionsangriffe, die theoretisch gegen den ECDSA-Signaturalgorithmus durchgeführt werden können.

  • Ändern der Kurve, die zur Validierung der Signatur verwendet wird: Wenn man die Kurve ändert, die zur Validierung der Signatur verwendet wird, könnte man möglicherweise zwei Nachrichten mit derselben Signatur haben, die jeweils unter einer anderen Kurve berechnet wurden. Die einzigen Anforderungen an die neue Kurve sind, dass ihre Ordnung dieselbe wie die alte ist und dass sie für den Client akzeptabel ist. Ein Beispiel wäre der Wechsel von der Verwendung der Kurve secp256r1 (alias P-256) zur Verwendung von secp256k1. (Beide sind 256-Bit-Kurven.) Wir haben derzeit keine Möglichkeit, mit dieser Version des Angriffs umzugehen, außer den gesamten Satz von Kurven einzuschränken, die verwendet werden können.

  • Ändern der Hash-Funktion, die zur Validierung der Signatur verwendet wird: Wenn man entweder zwei verschiedene Hash-Funktionen derselben Länge hat oder eine Hash-Funktion abschneiden kann, könnte man möglicherweise Kollisionen zwischen den Hash-Funktionen finden, anstatt innerhalb einer einzelnen Hash-Funktion. Zum Beispiel könnte das Abschneiden von SHA-512 auf 256 Bit mit einem SHA-256-Bit-Hash-Wert kollidieren. Da der Hash-Algorithmus Teil des Signaturalgorithmus-Identifikators ist, wird dieser Angriff durch die Aufnahme eines Signaturalgorithmus-Identifikators in den geschützten Header-Bucket abgeschwächt.

2.2. Edwards-Curve Digital Signature Algorithm (EdDSA)

[RFC8032] beschreibt das elliptische Kurven-Signaturschema Edwards-curve Digital Signature Algorithm (EdDSA). In diesem Dokument wird der Signaturalgorithmus unter Verwendung von Parametern für die Kurven edwards25519 und edwards448 instanziiert. Das Dokument beschreibt zusätzlich zwei Varianten des EdDSA-Algorithmus: Pure EdDSA, bei dem keine Hash-Funktion auf den Inhalt vor dem Signieren angewendet wird, und HashEdDSA, bei dem eine Hash-Funktion auf den Inhalt vor dem Signieren angewendet wird und das Ergebnis dieser Hash-Funktion signiert wird. Für EdDSA wird der zu signierende Inhalt (entweder die Nachricht oder der Prehash-Wert) zweimal innerhalb des Signaturalgorithmus verarbeitet. Zur Verwendung mit COSE wird nur die Pure EdDSA-Version verwendet. Dies liegt daran, dass nicht erwartet wird, dass extrem große Inhalte benötigt werden, und basierend auf der Anordnung der Nachrichtenstruktur muss die gesamte Nachricht im Speicher gehalten werden, um eine Signatur zu erstellen oder zu überprüfen. Daher scheint es nicht notwendig zu sein, Blockaktualisierungen des Hashs durchzuführen, gefolgt vom Entfernen der Nachricht aus dem Speicher. Anwendungen können dieselben Funktionen bereitstellen, indem sie den Inhalt der Nachricht als Hash-Wert definieren und das COSE-Objekt (mit dem Hash-Wert) und den Inhalt als separate Elemente transportieren.

Der in diesem Dokument definierte Algorithmus finden Sie in Tabelle 2. Ein einzelner Signaturalgorithmus wird definiert, der für mehrere Kurven verwendet werden kann.

                  +=======+=======+=============+
| Name | Value | Description |
+=======+=======+=============+
| EdDSA | -8 | EdDSA |
+-------+-------+-------------+

Tabelle 2: EdDSA-Algorithmuswert

[RFC8032] beschreibt die Methode zur Codierung des Signaturwertes.

Bei Verwendung eines COSE-Schlüssels für diesen Algorithmus werden folgende Prüfungen durchgeführt:

  • Das Feld "kty" MUSS vorhanden sein und es MUSS "OKP" (Octet Key Pair) sein.

  • Das Feld "crv" MUSS vorhanden sein und es MUSS eine für diesen Signaturalgorithmus definierte Kurve sein.

  • Wenn das Feld "alg" vorhanden ist, MUSS es mit "EdDSA" übereinstimmen.

  • Wenn das Feld "key_ops" vorhanden ist, MUSS es "sign" enthalten, wenn eine EdDSA-Signatur erstellt wird.

  • Wenn das Feld "key_ops" vorhanden ist, MUSS es "verify" enthalten, wenn eine EdDSA-Signatur überprüft wird.

2.2.1. Sicherheitsüberlegungen für EdDSA

Öffentliche Werte werden in EdDSA und Elliptic Curve Diffie-Hellman (ECDH) unterschiedlich berechnet; aus diesem Grund sollte der öffentliche Schlüssel von einem nicht mit dem anderen Algorithmus verwendet werden.

Wenn eine Batch-Signaturüberprüfung durchgeführt wird, ist ein gut gesäter kryptografischer Zufallszahlengenerator ERFORDERLICH (Abschnitt 8.2 von [RFC8032]). Das Signieren und die Nicht-Batch-Signaturüberprüfung sind deterministische Operationen und benötigen keine Zufallszahlen irgendeiner Art.