Eröffnung in Kürze — Autoren behalten 100 % ihres Preises Autor werden Anmelden Konto erstellen
Hallo, anmelden Konto & Listen IhrAutorenbereich

Die Signatur selbst prüfen

1.Warum die Antwort signiert ist

Ohne Signatur genügt eine Zeile in der hosts-Datei eines Servers, um an unserer Stelle „Lizenz gültig“ zu antworten. Jede Antwort trägt eine Ed25519-Signatur über die kanonische Form der Daten — Schlüssel sortiert, kompaktes JSON. Prüfen Sie sie, bevor Sie irgendetwas glauben. Die Bibliothek tut das für Sie, auch bei der Kopie im Cache, die ihrerseits an ihren Host gebunden ist und sich deshalb nicht von einer Seite auf eine andere kopieren lässt.

2.Die Signatur selbst prüfen

Nur nötig, wenn Sie die API direkt aufrufen. Bauen Sie die kanonische Form aus dem geparsten Objekt neu auf — nie aus den empfangenen Rohbytes, die abweichen können — und prüfen Sie dann die abgetrennte Ed25519-Signatur gegen unseren öffentlichen Schlüssel.

Unser öffentlicher Schlüssel

Ed25519, 32 rohe Bytes in base64. Er ist für jeden Autor und jedes Produkt derselbe.

/PTkKQpweo9XCLOS0+b0vgrecx7Ly/SsAuwTiA737Tw=

Die kanonische Form

Die Signatur deckt das Objekt donnees ab, serialisiert nach diesen vier Regeln, und nichts sonst. Eine davon falsch, und jede Signatur wirkt ungültig.

  1. Schlüssel aufsteigend sortiert.
  2. Keine Leerzeichen: weder nach den Doppelpunkten noch nach den Kommas.
  3. Schrägstriche werden nicht maskiert.
  4. Nicht-ASCII-Zeichen bleiben UTF-8, ohne Backslash-u-Maskierung.

Für die obige Antwort die genau signierten Bytes:

utf-8
{"domaine":"exemple.fr","emis":1790687453,"essai":false,"hote":"boutique.exemple.fr","motif":"","ok":true,"quand":"","revalider":1790773853,"sursis":2592000}
PHP PHP
sodium
function signature_valide(array $donnees, $signature, $publique)
{
    ksort($donnees);
    $corps = json_encode($donnees, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

    return sodium_crypto_sign_verify_detached(
        base64_decode($signature, true),
        $corps,
        base64_decode($publique, true)
    );
}
JS Node.js
node:crypto
import { createPublicKey, verify } from 'node:crypto';

const publique = createPublicKey({
  key: Buffer.concat([Buffer.from('302a300506032b6570032100', 'hex'),
                      Buffer.from('/PTkKQpweo9XCLOS0+b0vgrecx7Ly/SsAuwTiA737Tw=', 'base64')]),
  format: 'der',
  type: 'spki',
});

const canonique = (d) =>
  JSON.stringify(Object.fromEntries(Object.keys(d).sort().map((k) => [k, d[k]])));

const valide = verify(null, Buffer.from(canonique(rep.donnees), 'utf8'),
                      publique, Buffer.from(rep.signature, 'base64'));
PY Python
cryptography
import base64, json
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey

publique = Ed25519PublicKey.from_public_bytes(base64.b64decode('/PTkKQpweo9XCLOS0+b0vgrecx7Ly/SsAuwTiA737Tw='))

canonique = json.dumps(rep['donnees'], sort_keys=True,
                       separators=(',', ':'), ensure_ascii=False)

publique.verify(base64.b64decode(rep['signature']), canonique.encode('utf-8'))

Etwas unklar?

Schreiben Sie uns aus Ihrem Autorenbereich. Eine Frage, die gestellt werden musste, heißt meistens, dass dieser Seite ein Absatz fehlt.

Autorenbereich