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.
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.
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>
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>
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>
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!