Maison >développement back-end >tutoriel php >Comment décrypter les mots de passe cryptés CryptoJS en PHP à l'aide de mcrypt ?

Comment décrypter les mots de passe cryptés CryptoJS en PHP à l'aide de mcrypt ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-05 07:31:01741parcourir

How to Decrypt CryptoJS Encrypted Passwords in PHP Using mcrypt?

Déchiffrement des mots de passe cryptés CryptoJS en PHP à l'aide de mcrypt

Énoncé du problème

En JavaScript, un mot de passe utilisateur crypté est créé à l'aide de CryptoJS, en utilisant un mot de passe- dérivation de clé basée sur la clé et l'IV. Cependant, les tentatives de décryptage sur le serveur PHP, utilisant la bibliothèque mcrypt, ont échoué, ce qui a donné lieu à des chaînes déchiffrées absurdes.

Solution

L'erreur principale provient des différentes méthodes de cryptage utilisées dans JavaScript (CryptoJS ) et PHP (mcrypt). Dans CryptoJS, la clé et l'IV sont dérivés du mot de passe, tandis que mcrypt s'appuie uniquement sur le mot de passe pour le cryptage/déchiffrement. Pour remédier à cela, la clé et l'IV doivent être générés en PHP selon une technique similaire à celle utilisée dans CryptoJS.

Code JavaScript révisé

Transfert des paramètres saltHex et cipherTextHex au serveur PHP, un un processus de cryptage JavaScript amélioré est désormais implémenté :

<code class="javascript">var encryptedPassword = CryptoJS.AES.encrypt(password, "Secret Passphrase");
var ivHex = encryptedPassword.iv.toString();
var saltHex = encryptedPassword.salt.toString(); 
var cipherTextHex = encryptedPassword.ciphertext.toString();</code>

Dérivation de la clé et de l'IV en PHP

La fonction PHP suivante dérive la clé et l'IV d'un mot de passe et d'un sel :

<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") {
    /* ... code for key and IV derivation ... */
    return [
        "key" => substr($derivedBytes, 0, $keySize * 4),
        "iv"  => substr($derivedBytes, $keySize * 4, $ivSize * 4)
    ];
}</code>

Déchiffrement en PHP à l'aide de mcrypt

Armé de la clé dérivée et de l'IV, le décryptage est effectué en PHP :

<code class="php">$keyAndIV = evpKDF("Secret Passphrase", hex2bin($saltHex));
$decryptPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, 
        $keyAndIV["key"], 
        hex2bin($cipherTextHex), 
        MCRYPT_MODE_CBC, 
        $keyAndIV["iv"]);</code>

Déchiffrement en PHP à l'aide d'OpenSSL (méthode alternative)

L'utilisation de l'extension OpenSSL est une alternative pour le décryptage :

<code class="php">$decryptPassword = openssl_decrypt(
        substr($ciphertext, 16), 
        "aes-256-cbc",
        $keyAndIV["key"], 
        OPENSSL_RAW_DATA, 
        $keyAndIV["iv"]);</code>

Avec ces modifications, un cryptage et un déchiffrement transparents du mot de passe de l'utilisateur sont désormais réalisables entre JavaScript et PHP, garantissant une gestion sécurisée des données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn