Aktueller Standort: Startseite> Neueste Artikel> Wie vervollständigt Hash_Final die digitale Signatur mit OpenSSL_sign?

Wie vervollständigt Hash_Final die digitale Signatur mit OpenSSL_sign?

gitbox 2025-05-26

In PHP sind digitale Signaturen ein wichtiges Mittel, um die Datenintegrität und Identitätsauthentifizierung sicherzustellen. Durch die Verdauung der Daten (Hashing) und das Verschlingen des Digests mit einem privaten Schlüssel kann der Absender beweisen, dass die Daten tatsächlich von selbst gesendet werden und während der Übertragung nicht manipuliert wurden. In diesem Artikel wird ausführlich erläutert, wie die Funktionen von Hash_Final und OpenSSL_IGN kombiniert werden, um einen vollständigen digitalen Signaturprozess zu implementieren.

1. Überprüfung der grundlegenden Konzepte

1. Hash -Serienfunktionen

PHP bietet eine Reihe von Funktionen für die Generierung von Hash -Digests, einschließlich Hash_init , Hash_Update und Hash_Final . Diese Funktionen unterstützen Streaming -Operationen und eignen sich für die Verarbeitung von Daten, die in großen Dateien oder Segmenten übertragen werden.

2. OpenSSSL_sign -Funktion

OpenSSL_SIGN verwendet einen privaten Schlüssel, um die Daten zu unterschreiben, um einen irreversiblen Verschlüsselungsdigest zu generieren. Die signierten Daten können mit dem öffentlichen Schlüssel überprüft werden.

2. Signiervorgangsschritte

Wir werden in einem einfachen Szenario demonstrieren, vorausgesetzt, wir müssen einen größeren String -Inhalt digital unterzeichnen.

1. Initialisieren Sie den Hash -Kontext

 $context = hash_init('sha256');

Hier verwenden wir den SHA-256-Algorithmus. Sie können auch andere Algorithmen basierend auf den tatsächlichen Anforderungen auswählen.

2. Aktualisieren Sie Daten in Segmenten (simulieren Sie die Big -Data -Verarbeitung)

 $dataParts = [
    'Der erste Absatz,Wahrscheinlich aus einem Teil der hochgeladenen Datei。',
    'Der zweite Absatz,Wahrscheinlich ein Teil des Streamings oder Protokollierens。',
    'Der letzte Absatz,Einen vollständigen Datenblock darstellen。'
];

foreach ($dataParts as $part) {
    hash_update($context, $part);
}

Dieser Code simuliert die Verarbeitungsmethode von Big Data und fügt Daten über Hash_update -Segmente hinzu, was für Szenarien geeignet ist, in denen er nicht gleichzeitig in den Speicher gelesen werden kann.

3. Erstellen Sie die endgültige Zusammenfassung

 $finalDigest = hash_final($context, true); // Verwenden des ursprünglichen binären Formats

Beachten Sie, dass wir den zweiten Parameter auf True einstellen, damit wir die ursprünglichen Binärdaten für die Signatur und nicht die hexadezimale Zeichenfolge erhalten können.

4. Unterschreiben Sie mit dem privaten Schlüssel

 $privateKey = file_get_contents('/path/to/private_key.pem');
$pkeyid = openssl_pkey_get_private($privateKey);

if (!$pkeyid) {
    die('Private Schlüsselbelastung fehlgeschlagen');
}

$signature = '';
if (!openssl_sign($finalDigest, $signature, $pkeyid, OPENSSL_ALGO_SHA256)) {
    die('Signatur fehlgeschlagen');
}

openssl_free_key($pkeyid);

Hier wird der Digest mit dem privaten Schlüssel über OpenSSL_SIGN signiert und der gleiche Algorithmus wird angegeben (SHA-256).

5. Die Signatur sicher übertragen oder speichern

Sie können die Signatur für eine einfache Übertragung in URLs, JSON oder anderen nicht-binären Kanälen basieren:

 $encodedSignature = base64_encode($signature);
echo "Signiert als: " . $encodedSignature;

3. Signaturüberprüfung (optional)

Um die Signatur zu überprüfen, können der entsprechende öffentliche Schlüssel und OpenSSL_VERIFY verwendet werden:

 $publicKey = file_get_contents('https://gitbox.net/keys/public_key.pem');
$pubkeyid = openssl_pkey_get_public($publicKey);

$isValid = openssl_verify($finalDigest, base64_decode($encodedSignature), $pubkeyid, OPENSSL_ALGO_SHA256);

if ($isValid === 1) {
    echo "Die Unterschriftenüberprüfung war erfolgreich";
} elseif ($isValid === 0) {
    echo "Ungültige Signatur";
} else {
    echo "Im Überprüfungsprozess trat ein Fehler auf";
}

4. Zusammenfassung

Durch die Kombination von Hash_init / Hash_Update / Hash_Final mit OpenSSL_sign können wir einen flexiblen und sicheren digitalen Signaturmechanismus implementieren. Diese Methode eignet sich besonders für Szenarien, in denen Big Data in Segmenten verarbeitet werden muss. Vergessen Sie nicht, die Sicherheit von privaten Schlüssel und signierten Daten während der Übertragung zu schützen und sicherzustellen, dass die Gesamtkette des Systems nicht zerstört wird.