Расшифровка hls потока с помощью openssl_decrypt
Что использовать для расшифровки hls стрима, краткий гайд для работы с функцией openssl_decrypt() в в PHP
С чего все началось
Один из моих проектов выкачивает видео с одного достаточно популярного сайта, но уже несколько потерявшего свое былое величие. С недавних пор этот сайт начал отдавать видео, зашифрованное с помощью алгоритма AES-128. Пользователи начали жаловаться на то, что скачанное видео не воспроизводится, что вылилось в срочную доработку кода "качалки" видео.
Что имеем на руках
Итак, у нас есть обычный плейлист m3u8 потока в виде:
Раньше в плейлисте были указаны только чанки (куски) потока, пример k0_chunk_1555561741998417630_0_a.ts. Именно после их объединения и и получался на выходе один большой файл. Теперь можно заметить, что появилась новая строка с указанием метода шифрования, ключа и дополнительных параметров.
Алгоритм шифрования - AES-128, более подробно о нем можно почитать на Хабре. Нам же он понадобится для указания метода в функции дешифрования.
Можно было бы использовать функцию mcrypt_decrypt() или попробовать расшифровать с помощью:
Но mcrypt_decrypt() устарела и в PHP 7.2 была удалена. Вместо нее воспользуемся openssl_decrypt().
- data - Данные для расшифровки.
- method - Метод шифрования. Список доступных методов можно получить с помощью функции openssl_get_cipher_methods().
- key - Ключ.
- options - options можно задать одной из констант: OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING.
- iv - Ненулевой инициализирующий вектор.
- tag - Тег аутентификации в режиме шифрования AEAD. Если он некорректен, то аутентификация завершится неудачей и функция вернет FALSE.
- aad - Дополнительные аутентификационные данные.
Обратите внимание на то, что ненулевые инициализирующие вектора мы преобразуем из шестнадцатеричных данных в двоичные, с помощью функции hex2bin(). Когда я просто пытался расшифровать без преобразования векторов, то видео было без звука, тоже важно это заметить. Второе, на что нужно обратить внимание, если не обрезать 0x в строке с вектором, то звук также может отсутствовать, да и в принципе видео, в моем случае, было "битым" в некоторых местах.
Подведем итоги
- функция mcrypt_decrypt() устарела и удалена
- используем openssl_decrypt()
- обрезаем у ненулевых инициализирующих векторов 0x
- не забываем преобразовать ненулевые вектора с помощью hex2bin()
Yrstal14.02.2024
Здравствуйте у меня такой вопрос. Можно ли с hls или с m3u8 стриминга потока узнать оригинальную ссылку стрима? Либо ip адрес первоначального стримера?