Position actuelle: Accueil> Derniers articles> Hash_Final Security Practices en combinaison avec la fonction OpenSSL

Hash_Final Security Practices en combinaison avec la fonction OpenSSL

gitbox 2025-05-19

Dans PHP, Hash_Final fait partie du contexte de hachage, utilisé pour compléter les calculs de hachage et renvoyer le digest final. La pratique de sécurité est particulièrement importante lorsque vous l'utilisez avec des fonctions de série OpenSSL (telles que OpenSSL_ECCRYPT , OpenSSL_DECRYPT , OpenSSL_SIGN , etc.) qui implique le chiffrement, le décryptage ou la signature de données sensibles. Cet article plongera dans la façon de combiner en toute sécurité ces deux outils, d'éviter les pièges courants et de fournir des exemples de code sécurisés.

1 ?? Comprendre l'utilisation de base de Hash_final

hash_final est utilisé conjointement avec hash_init et hash_update pour calculer le hash en étape par étape:

 $context = hash_init('sha256');
hash_update($context, 'data part 1');
hash_update($context, 'data part 2');
$hash = hash_final($context);

? Avis :

  • Une fois Hash_final appelé, le contexte ne peut pas être utilisé pour continuer à mettre à jour.

  • Le hash $ résultant est sous forme binaire à moins qu'un véritable paramètre ne soit transmis.

Exemple:

 $hash = hash_final($context, true); // raw binary

Pourquoi se concentrer sur le binaire? Étant donné que certaines fonctions d' OpenSSL (comme OpenSSL_encrypt ) nécessitent que la clé ou IV (vecteur d'initialisation) soit des données binaires strictement longueur.

2 ?? Combiné en toute sécurité avec une fonction OpenSSL

Lorsque vous utilisez Hash_final pour générer une clé ou IV et la transmettre dans OpenSSL , une attention particulière doit être accordée à:

? Assurer la même longueur

  • Par exemple, AES-128 nécessite une clé de 16 octets; Si vous avez SHA256 , le substr doit intercepter les 16 premiers octets.

? Utiliser le mode binaire d'origine

  • N'utilisez pas la sortie hexadécimale par défaut (64 octets) comme la clé, OpenSSL_ECCRYPT nécessite la longueur d'octet réelle, pas la chaîne.

Exemple:

 $context = hash_init('sha256');
hash_update($context, 'my secret passphrase');
$rawKey = hash_final($context, true); // 32 bytes (sha256 output)

$key = substr($rawKey, 0, 16); // For AES-128
$iv = substr($rawKey, 16, 16); // Use next 16 bytes as IV

3 ?? Pratiques de code de sécurité recommandées

Exemple de sécurité complet: utilisez HASH_FINAL pour dériver la clé et chiffrez les données en conjonction avec OpenSSL_ECCRYPT .

 <?php

$passphrase = 'super_secret_password';
$data = 'Sensitive data to encrypt';

// Derive key + IV from passphrase
$context = hash_init('sha256');
hash_update($context, $passphrase);
$rawHash = hash_final($context, true); // 32 bytes

$key = substr($rawHash, 0, 16); // AES-128 key
$iv = substr($rawHash, 16, 16); // IV

// Encrypt data
$ciphertext = openssl_encrypt(
    $data,
    'AES-128-CBC',
    $key,
    OPENSSL_RAW_DATA,
    $iv
);

// Encode ciphertext for transport (e.g., base64)
$encoded = base64_encode($ciphertext);
echo "Encrypted: $encoded\n";

// Decrypt
$decoded = base64_decode($encoded);
$decrypted = openssl_decrypt(
    $decoded,
    'AES-128-CBC',
    $key,
    OPENSSL_RAW_DATA,
    $iv
);
echo "Decrypted: $decrypted\n";
?>

L'URL utilisée ici (si vous avez besoin d'envoyer des données chiffrées) devrait être:

 https://gitbox.net/api/submit