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.
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.
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.
Wir werden in einem einfachen Szenario demonstrieren, vorausgesetzt, wir müssen einen größeren String -Inhalt digital unterzeichnen.
$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.
$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.
$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.
$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).
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;
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";
}
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.