Під час розробки програмного забезпечення, яке передбачає шифрування та дешифрування даних як у фронтенді, так і у бекенді, можуть виникати різноманітні проблеми, пов’язані з неправильним використанням криптографічних бібліотек. Однією з таких проблем є ситуація, коли використання CryptoJS для симетричного шифрування в фронтенді не збігається з відповідним дешифруванням у бекенді за допомогою PHP. У цій статті ми розглянемо деякі типові причини цієї проблеми та можливі шляхи її вирішення.
У нашому прикладі ми використовуємо бібліотеку CryptoJS для шифрування текстових даних у фронтенді за допомогою алгоритму AES в режимі CBC з використанням вектора ініціалізації (IV). Ключ та IV генеруються динамічно та передаються функції шифрування як параметри.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script> <script> var key = '56d4wa56d456sa4d5s6a4ds56a4d5s6a'; var iv = '5412512512'; function encrypt(text,k,i){ var key = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(k)); var iv = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(i).toString().substr(8, 16)); var encrypted = CryptoJS.AES.encrypt(text, key, { iv: iv, mode:CryptoJS.mode.CBC, padding:CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } console.log(encrypt('123456',key,iv)); //вивід cJ1b6TqsnoNFEkSuD3z5RQ== </script> |
Ключ та IV передаються у бекенд за допомогою HTTP-запиту, де вони використовуються для розшифрування даних за допомогою функції dencryptWithOpenssl().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$key = '56d4wa56d456sa4d5s6a4ds56a4d5s6a'; $iv = '5412512512'; $encryptedText = 'cJ1b6TqsnoNFEkSuD3z5RQ=='; $decryptedText = dencryptWithOpenssl($encryptedText, $key, $iv); echo $decryptedText; // вивід розшифрованого тексту function dencryptWithOpenssl($data,$key,$iv) { $data = base64_decode($data); $key = md5($key); $iv = substr(md5($iv), 8, 16); // використовується середні 16 символів хешу MD5 як IV $decryptedData= openssl_decrypt($data, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv); if ($decryptedData === false) { return "Розшифрування не вдалось: " . openssl_error_string(); } else { return $decryptedData; } } |
Проте, після розшифрування у бекенді, отримуємо помилку “return false”, що свідчить про невдачу дешифрування. Причини цієї проблеми можуть бути різними і варто ретельно перевірити наступні аспекти:
Для вирішення цієї проблеми може знадобитися додатковий аналіз та налагодження коду, а також перевірка різних варіантів реалізації шифрування та дешифрування. Важливо також пам’ятати про забезпечення безпеки при обробці конфіденційної інформації, зокрема використання надійних методів шифрування та збереження ключів у безпечному місці.
У випадку невдачі вирішення проблеми самостійно рекомендується звернутися до спеціалістів з криптографії або програмного забезпечення для допомоги у вирішенні складних проблем із шифруванням та дешифруванням даних.