Шифрование в PHP и расшифровка в JavaScript по ключу

Author Автор: Роман Чернышов    Опубликовано: 15 декабря 2024

crypt Доброго времени друзья! Недавно разрабатывал одно интересное клиент-серверное решение, на JavaScript с одной стороны и на PHP с другой. Взаимодействие клиента и сервера подразумевало передачу данных от сервера на PHP, клиенту на JavaScript, при этом сами данные должны были быть зашифрованы с использованием ключа. Несмотря на то, что для расшифровки данных, ключ необходимо хранить на стороне клиента(делая его потенциально доступным при разборе кода), все же такое шифрование может быть полезным, например для сокрытия данных от различных инструментов просмотра трафика и содержимого HTTP/S запросов (то есть небольшой шаг в строну усложнения процесса деобфускации и разбора клиентского кода).

Шифрование на PHP

/**
 * @param string $data Строка подлежащая шифрованию
 * @param string $secretKey Секретный ключ
 * @param string $secretIv Секретная соль (IV)
 * @return string $encrypted Результат в BASE64
 */
function encryptData($data, $secretKey = 'TheQuickBrownFoxWasJumping', $secretIv = '4f01bede9221586c')  {
        // Создание хешей для секретного ключа и IV(соли)
        $key = substr(hash('sha256', $secretKey), 0, 32);
        $iv = substr(hash('sha256', $secretIv), 0, 16);
 
        // Шифрование данных
        $encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
 
        // Результат в BASE64
        return $encrypted;
}
 
echo encryptData('Тестовая строка подлежащая шифрованию');

Расшифровка на JavaScrit

Для работы нужно подключить две JavaScrit библиотеки CryptoJS v3.1.2 и поддержка алгоритма SHA256:

<script src="https://rche.ru/lib/js/encryption.js"></script>
<script src="https://rche.ru/lib/js/hash256.js"></script>
/**
 * @param string encryptedData Строка подлежащая расшифровке
 * @param string secret_key Секретный ключ
 * @param string secret_iv Секретная соль (IV)
 * @return string decrypted Расшифрованная строка
 */
function decryptEncData(encryptedData , secret_key, secret_iv) {
  var Sha256 = CryptoJS.SHA256;
  var Hex = CryptoJS.enc.Hex;
  var Utf8 = CryptoJS.enc.Utf8;
  var Base64 = CryptoJS.enc.Base64;
  var AES = CryptoJS.AES;
  var key = Sha256(secret_key).toString(Hex).substr(0, 32); 
  var iv = Sha256(secret_iv).toString(Hex).substr(0, 16);
 
  // Decryption
  var decrypted = AES.decrypt(encryptedData , Utf8.parse(key), {
    iv: Utf8.parse(iv),
  }).toString(Utf8);
  console.log(decrypted); // test
}
 
var secret_key = "TheQuickBrownFoxWasJumping";
var secret_iv = "4f01bede9221586c";
decryptEncData('4n5f4PebUxQS0Ex0rHu5Ig==', secret_key, secret_iv);

Оставить комментарий

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Купить за 359₽
Популярные записи
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка