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.
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.
Ed25519, 32 rohe Bytes in base64. Er ist für jeden Autor und jedes Produkt derselbe.
/PTkKQpweo9XCLOS0+b0vgrecx7Ly/SsAuwTiA737Tw=
Die Signatur deckt das Objekt donnees ab, serialisiert nach diesen vier Regeln, und nichts sonst. Eine davon falsch, und jede Signatur wirkt ungültig.
Für die obige Antwort die genau signierten Bytes:
{"domaine":"exemple.fr","emis":1790687453,"essai":false,"hote":"boutique.exemple.fr","motif":"","ok":true,"quand":"","revalider":1790773853,"sursis":2592000}
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)
);
}
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'));
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'))
Schreiben Sie uns aus Ihrem Autorenbereich. Eine Frage, die gestellt werden musste, heißt meistens, dass dieser Seite ein Absatz fehlt.