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.
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.
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.
Nous allons démontrer dans un scénario simple, en supposant que nous devons signer numériquement un contenu de chaîne plus grand.
$context = hash_init('sha256');
Ici, nous utilisons l'algorithme SHA-256. Vous pouvez également choisir d'autres algorithmes en fonction des besoins réels.
$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.
$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.
$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).
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;
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";
}
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.