#EXT-X-KEY
#EXT-X-KEY 태그는 HLS에서 세그먼트 단위 암호화 방식과 키 정보를 지정하는 메커니즘이다.
METHOD=AES-128
- 전체 세그먼트 파일을 AES-128 CBC 모드로 암호화한다.
- IV가 지정되지 않으면, 플레이어는 세그먼트의 미디어 시퀀스 번호를 기반으로 IV를 유도한다.
URI로 지정된 키 경로에서 대칭키를 가져온다. 평문 HTTP(S) 요청을 통해 조회할 수 있다.
METHOD=NONE
- 암호화가 적용되지 않은 상태를 명시한다.
- #EXT-X-KEY:METHOD =NONE이 등장하면, 이후 세그먼트들은 모두 평문으로 전송된다.
METHOD=SAMPLE-AES(DRM)
-
각 미디어 샘플(예: 오디오 프레임, 비디오 NAL 단위)에 대해 암호화를 적용한다.
-
내부적으로 AES-CTR 또는 AES-CBCS(CBC with Subsample) 방식이 사용된다.
-
URIdata:text/plain;base64,...형태의 URI는 DRM 초기화에 필요한 데이터(PSSH, Protection System Specific Header)를 base64로 포함한다.- 이 PSSH는 어떤 DRM 시스템(Widevine, FairPlay, PlayReady 등)을 사용할지, 어떤 키를 요청해야 하는지를 알려주는 메타데이터이다.
- 플레이어는 이 정보를 DRM 클라이언트(CDM, Content Decryption Module)에 전달해 DRM 세션을 초기화한다.
- FairPlay의 경우
skd://형태의 URI를 사용하는데, 플레이어는 CDM이 생성한 챌린지를skd://로 지정된 라이선스 서버에 전송하고, 서버로부터 CKC(Content Key Context)를 받아 CEK를 복호화한다.
-
KEYID=0x76776AFF...- 콘텐츠를 암호화한 대칭키(CEK, Content Encryption Key)를 식별하기 위한 식별자다.
- 플레이어는 이 KEYID를 DRM 서버에 요청 메시지에 포함시켜, 해당 콘텐츠에 맞는 라이선스를 받아야 한다.
- 이때 CEK는 절대 평문으로 전달되지 않으며, DRM 서버는 장치 고유 키로 암호화(래핑)한 형태로 CEK를 반환한다.
- CDM은 내부의 신뢰된 영역(TEE 또는 하드웨어 키 저장소)에서 이 CEK를 언래핑하여 실제 복호화에 사용한다.
-
IV=0x70796F34...- AES 블록 암호 모드에서 사용되는 초기화 벡터로, 동일한 키를 사용하더라도 매 세그먼트마다 다른 암호문이 생성되도록 한다.
- IV가 중복되면 키 스트림이 재사용되어 통계적 분석 공격이 가능해지므로, 각 세그먼트는 고유한 IV를 사용해야 한다.
-
참고 - https://ottverse.com/what-is-ext-x-key-in-hls-playlists/ - https://stackoverflow.com/questions/16132088/how-to-decrypt-aes-128-encrypted-m3u8-video-files - https://datatracker.ietf.org/doc/html/rfc8216 - https://developer.apple.com/documentation/http-live-streaming/using-content-protection-systems-with-hls - https://castr.com/blog/hls-encryption/ - https://docs.unified-streaming.com/tutorials/drm/sample_aes.html