Skip to content

m3u8 암호화

#EXT-X-KEY

#EXT-X-KEY 태그는 HLS에서 세그먼트 단위 암호화 방식과 키 정보를 지정하는 메커니즘이다.

  1. METHOD=AES-128
  • 전체 세그먼트 파일을 AES-128 CBC 모드로 암호화한다.
  • IV가 지정되지 않으면, 플레이어는 세그먼트의 미디어 시퀀스 번호를 기반으로 IV를 유도한다.
  • URI로 지정된 키 경로에서 대칭키를 가져온다. 평문 HTTP(S) 요청을 통해 조회할 수 있다.
  1. METHOD=NONE
  • 암호화가 적용되지 않은 상태를 명시한다.
  • #EXT-X-KEY:METHOD =NONE이 등장하면, 이후 세그먼트들은 모두 평문으로 전송된다.
  1. METHOD=SAMPLE-AES (DRM)
  • 각 미디어 샘플(예: 오디오 프레임, 비디오 NAL 단위)에 대해 암호화를 적용한다.

  • 내부적으로 AES-CTR 또는 AES-CBCS(CBC with Subsample) 방식이 사용된다.

    • URI

      • data: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