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

Patricia Arquette
Libérer: 2024-11-05 07:31:01
original
693 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal