Position actuelle: Accueil> Derniers articles> Comment Hash_Final est-il complet de signature numérique avec OpenSSL_SIGN?

Comment Hash_Final est-il complet de signature numérique avec OpenSSL_SIGN?

gitbox 2025-05-26

En PHP, les signatures numériques sont un moyen important pour assurer l'intégrité des données et l'authentification de l'identité. En digérant les données (hachage) et en cryptant le digest avec une clé privée, l'expéditeur peut prouver que les données sont en effet envoyées par elle-même et n'ont pas été falsifiées pendant la transmission. Cet article expliquera en détail comment combiner les fonctions HASH_FINAL et OpenSSL_Sign pour implémenter un processus de signature numérique complet.

1. Examen des concepts de base

1. Fonctions de la série de hachage

PHP fournit une série de fonctions pour générer des digestions de hachage, notamment Hash_Init , Hash_update et Hash_Final . Ces fonctions prennent en charge les opérations de streaming et conviennent au traitement des données transmises dans de grands fichiers ou segments.

2. Fonction OpenSSL_SIGN

OpenSSL_SIGN utilise une clé privée pour signer les données pour générer un digestion de cryptage irréversible. Les données signées peuvent être vérifiées à l'aide de la clé publique.

2. Étapes du processus de signature

Nous allons démontrer dans un scénario simple, en supposant que nous devons signer numériquement un contenu de chaîne plus grand.

1. Initialiser le contexte de hachage

 $context = hash_init('sha256');

Ici, nous utilisons l'algorithme SHA-256. Vous pouvez également choisir d'autres algorithmes en fonction des besoins réels.

2. Mettre à jour les données dans les segments (simuler le traitement des mégadonnées)

 $dataParts = [
    'Le premier paragraphe,Probablement d'une partie du fichier téléchargé。',
    'Le deuxième paragraphe,Participe probablement dans le streaming ou la journalisation。',
    'Le dernier paragraphe,Constituer un bloc de données complet。'
];

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

Ce code simule la méthode de traitement des mégadonnées et ajoute des données via des segments hash_update , qui convient aux scénarios où il ne peut pas être lu dans la mémoire à la fois.

3. Générez le résumé final

 $finalDigest = hash_final($context, true); // Utilisation du format binaire d'origine

Notez que nous définissons le deuxième paramètre sur true afin que nous puissions obtenir les données binaires d'origine pour la signature, pas la chaîne hexadécimale.

4. Signer avec une clé privée

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

if (!$pkeyid) {
    die('Le chargement de la clé privée a échoué');
}

$signature = '';
if (!openssl_sign($finalDigest, $signature, $pkeyid, OPENSSL_ALGO_SHA256)) {
    die('La signature a échoué');
}

openssl_free_key($pkeyid);

Ici, le digest est signé à l'aide de la clé privée via OpenSSL_SIGN et le même algorithme est spécifié (SHA-256).

5. Transmettre ou enregistrer en toute sécurité la signature

Vous pouvez encodager la signature pour une transmission facile dans les URL, JSON ou autres canaux non binaires:

 $encodedSignature = base64_encode($signature);
echo "Signé comme: " . $encodedSignature;

3. Vérification de la signature (facultative)

Pour vérifier la signature, la clé publique correspondante et OpenSSL_verify peuvent être utilisées:

 $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 "La vérification de la signature a réussi";
} elseif ($isValid === 0) {
    echo "Signature non valide";
} else {
    echo "Une erreur s'est produite dans le processus de vérification";
}

4. Résumé

En combinant hash_init / hash_update / hash_final avec openssl_sign , nous pouvons implémenter un mécanisme de signature numérique flexible et sécurisé. Cette méthode convient particulièrement aux scénarios où les mégadonnées doivent être traitées dans des segments. N'oubliez pas de protéger la sécurité des clés privées et des données signées pendant la transmission, et assurez-vous que la chaîne de confiance globale du système n'est pas détruite.