미디어 암호화

Derek Herman
Derek Herman
Joe Medley
Joe Medley

이 섹션에서는 미디어를 암호화하는 두 가지 전략과 FFmpeg 및 Shaka Packager에서 이를 사용하는 방법에 관한 몇 가지 실용적인 예를 다룹니다. 여기서 설명할 암호화 전략은 Clear KeyGoogle Widevine과 같은 서비스를 사용하는 것입니다. 두 전략 모두 사용자가 미디어로 할 수 있는 작업을 제어하는 디지털 권한 관리 (DRM)의 한 형태입니다. 하지만 인증을 위해 키가 전달되는 방식으로 인해 하나는 본질적으로 다른 것보다 보안이 취약하므로 DRM 서비스를 사용하는 것이 더 적합할 수 있습니다.

웹의 기본 DRM 서비스는 Google Widevine, Microsoft PlayReady, Apple FairPlay이지만 이 문서에서 모든 서비스를 다루지는 않습니다. 하지만 모든 최신 브라우저를 타겟팅하는 경우 세 가지 DRM 서비스를 모두 사용하게 될 가능성이 높습니다.

변환 및 암호화는 다음 애플리케이션으로 실행됩니다.

키 암호화 지우기

먼저 Clear Key를 사용하기 전에 Clear Key의 장단점을 잘 이해해야 합니다. 기존 DRM 서비스를 사용하고 싶지 않고 미디어의 기본 암호화가 실행 가능한 옵션이라고 생각되면 Clear Key를 사용합니다. 하지만 이 유형의 암호화는 DRM 서비스 중 하나를 사용하는 것과 동일한 수준의 보안을 제공하지는 않습니다. 이는 라이선스 서버에 저장된 복호화 키로 생성된 암호화된 키와 달리 키-값 쌍이 다른 키로 암호화되지 않기 때문입니다. 또한 Clear Key는 키-값 쌍을 일반 텍스트로 전송하므로 미디어를 암호화하는 동안 미디어를 복호화하는 키가 비밀이 아닙니다.

키 만들기

동일한 메서드를 사용하여 DASH와 HLS 모두에 키를 만들 수 있습니다. OpenSSL을 사용하여 이 작업을 실행합니다. 다음은 16진수 값 16개로 구성된 암호화 키를 만듭니다.

openssl rand -hex 16 > media.key

IV 만들기

다음으로 초기화 벡터(IV)를 생성할 수 있습니다.

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Clear Key로 암호화

다음 예에서는 keyskey_ids가 Shaka Packager에 직접 제공되는 원시 키가 있는 Shaka Packager를 사용합니다. 자세한 예시는 문서를 참고하세요.

key 플래그에는 이전에 만든 media.key 파일에 저장된 키를 사용합니다. 그러나 명령줄에 입력할 때는 공백을 삭제해야 합니다. key_id 플래그의 경우 media.id 값을 반복하거나 위에 생성된 IV 값을 사용합니다.

packager \
  input=glocken.mp4,stream=audio,output=glockena.m4a \
  input=glocken.mp4,stream=video,output=glockenv.mp4 \
  --enable_fixed_key_encryption \
  --keys label=audio:key=INSERT_AUDIO_KEY_HERE:key_id=INSERT_AUDIO_KEY_ID_HERE,label=video:key=INSERT_VIDEO_KEY_HERE:key_id=INSERT_VIDEO_KEY_ID_HERE

키 정보 파일 만들기

HLS용으로 암호화하려면 키 파일 외에 키 정보 파일이 필요합니다. 키 정보 파일은 아래와 같은 형식의 텍스트 파일입니다. 확장자가 .keyinfo여야 합니다. 예를 들면 encrypt.keyinfo입니다.

key URI
key file path
private key

키 URI는 media.key (위에서 생성)가 서버에 있는 위치입니다. 키 파일 경로는 키 정보 파일에 대한 상대 위치입니다. 마지막으로 비공개 키는 media.key 파일 자체의 콘텐츠 또는 이전에 만든 IV입니다. 예를 들면 다음과 같습니다.

https://example.com/keys/media.key
/path/to/media.key
6143b5373a51cb46209cfed0d747da66

HLS 암호화

packager \
  'input=input.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
  'input=input.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
  --hls_master_playlist_output="master_playlist.m3u8" \
  --hls_base_url="http://localhost:5000/"

이 명령어는 16자 또는 32자(영문 기준)의 키를 허용합니다.

ffmpeg -i myvideo.mov -c:v libx264 -c:a aac -hls_key_info_file encrypt.keyinfo myvideo.m3u8

Widevine 암호화

이제 클리어 키 암호화의 정의와 사용 시기를 알게 되었습니다. 하지만 보안 강화를 위해 DRM 서비스를 사용해야 하는 경우는 언제일까요? 여기에서 Widevine 또는 다른 서비스가 미디어를 안전하게 암호화하고 복호화하는 데 사용됩니다. Widevine은 MPEG-DASH 및 HLS를 지원하며 Google의 DRM입니다. Widevine은 Google Chrome 및 Firefox 웹 브라우저, Android MediaDRM, Android TV, 암호화된 미디어 확장 프로그램 및 미디어 소스 확장 프로그램을 사용하는 기타 전자제품 기기에서 사용되며, 여기서 Widevine은 콘텐츠를 복호화합니다.

Widevine을 사용한 암호화

이 도움말의 대부분의 예에서는 Clear Key 암호화를 사용했습니다. 그러나 Widevine의 경우 다음 옵션을 바꾸는 것이 좋습니다.

--enable_fixed_key_encryption \
--enable_fixed_key_decryption \
--keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE

파일 이름과 --content-id 플래그를 제외한 디멀티플렉스기 (demux) 명령어의 모든 내용은 예시에서 정확하게 복사해야 합니다. --content-id는 16자리 또는 32자리의 임의 16진수입니다. 자체 키 대신 여기에 제공된 키를 사용하세요. 더 많은 예는 Widevine 키 서버 사용에 관한 Shaka Packager 문서를 참고하세요.

  1. 오디오와 동영상을 디뮤싱 (분리)하고 새 파일을 암호화한 다음 미디어 프레젠테이션 설명 (MPD) 파일을 출력합니다.

    packager \
      input=tmp_glocken.mp4,stream=video,output=glocken_video.mp4 \
      input=tmp_glocken.mp4,stream=audio,output=glocken_audio.m4a \
      --enable_widevine_encryption \
      --key_server_url "https://license.uat.widevine.com/cenc/getcontentkey/widevine_test" \
      --content_id "fd385d9f9a14bb09" \
      --signer "widevine_test" \
      --aes_signing_key "1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9" \
      --aes_signing_iv "d58ce954203b7c9a9a9d467f59839249"
    
  2. 오디오 및 동영상 스트림을 리믹스 (결합)합니다. 동영상 프레임워크를 사용하는 경우 이 작업을 하지 않아도 됩니다.

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
    

미디어 변환 시퀀스

이 섹션에서는 원시 .mov 파일에서 DASH 또는 HLS를 위해 패키징된 암호화된 애셋으로 가져오는 데 필요한 명령어를 보여줍니다. 설명을 위해 소스 파일을 1080p (1920x1080) 해상도에서 8Mbs의 비트 전송률로 변환합니다. 필요에 따라 이러한 값을 조정하세요.

DASH/WebM

  1. 파일 형식과 코덱을 변환합니다.

    이 명령어에서는 오디오 코덱에 liborbis 또는 libopus를 사용할 수 있습니다.

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. Clear Key 암호화 키를 만듭니다.

    openssl rand -hex 16 > media.key
    
  3. 오디오와 동영상을 디뮤싱 (분리)하고 새 파일을 암호화한 다음 미디어 프레젠테이션 설명 (MPD) 파일을 출력합니다.

    packager \
      input=tmp_glocken.webm,stream=video,output=glocken_video.webm \
      input=tmp_glocken.webm,stream=audio,output=glocken_audio.webm \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE \
      --mpd_output glocken_webm_vod.mpd
    
  4. 오디오 및 동영상 스트림을 리믹스 (결합)합니다. 동영상 프레임워크를 사용하는 경우 이 작업을 하지 않아도 됩니다.

    ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
    

DASH/MP4

  1. 파일 형식, 동영상 코덱, 비트 전송률을 변환합니다.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. Clear Key 암호화 키를 만듭니다.

    openssl rand -hex 16 > media.key
    
  3. 오디오와 동영상을 디뮤싱 (분리)하고 새 파일을 암호화한 다음 미디어 프레젠테이션 설명 (MPD) 파일을 출력합니다.

    packager \
      input=tmp_glocken.mp4,stream=video,output=glocken_video.mp4 \
      input=tmp_glocken.mp4,stream=audio,output=glocken_audio.m4a \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE \
      --mpd_output glocken_mp4_vod.mpd
    
  4. 오디오 및 동영상 스트림을 리믹스 (결합)합니다. 동영상 프레임워크를 사용하는 경우 이 작업을 하지 않아도 됩니다.

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
    

HLS/MP4

HLS는 MP4만 지원하므로 먼저 MP4 컨테이너 및 지원되는 코덱으로 변환해야 합니다.

  1. 파일 형식, 동영상 코덱 및 비트 전송률을 변환합니다.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Clear Key 암호화 키를 만듭니다.

    openssl rand -hex 16 > media.key
    
  3. 키 정보 파일 만들기

    packager \
      'input=glocken.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
      'input=glocken.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
      --hls_master_playlist_output="master_playlist.m3u8" \
      --hls_base_url="http://localhost:5000/" \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE
    

다소 많은 내용이었지만 이제 자신 있게 미디어를 암호화할 수 있기를 바랍니다. 다음으로 사이트에 미디어를 추가하는 방법을 알아보겠습니다.