在 JavaScript 中,使用 CryptoJS 创建加密的用户密码,利用密码 -基于密钥和 IV 的密钥派生。然而,在 PHP 服务器上使用 mcrypt 库的解密尝试失败了,导致了无意义的解密字符串。
主要错误源于 JavaScript 中使用的不同加密方法(CryptoJS ) 和 PHP (mcrypt)。在CryptoJS中,key和IV源自密码,而mcrypt仅依赖密码进行加密/解密。为了纠正这个问题,必须使用类似于 CryptoJS 中使用的技术在 PHP 中生成密钥和 IV。
将 saltHex 和 cipherTextHex 参数传输到 PHP 服务器,增强型 JavaScript 加密过程现已实现:
<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>
以下 PHP 函数从密码和盐派生密钥和 IV:
<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>
使用派生密钥和 IV,在 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>
使用 OpenSSL 扩展是解密的另一种选择:
<code class="php">$decryptPassword = openssl_decrypt( substr($ciphertext, 16), "aes-256-cbc", $keyAndIV["key"], OPENSSL_RAW_DATA, $keyAndIV["iv"]);</code>
通过这些修改,现在可以在 JavaScript 和 PHP 之间实现用户密码的无缝加密和解密,确保安全的数据处理。
以上是如何在 PHP 中使用 mcrypt 解密 CryptoJS 加密密码?的详细内容。更多信息请关注PHP中文网其他相关文章!