在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中文網其他相關文章!