미디어 암호화

데릭 허먼
데릭 허먼
조 메들리
조 메들리

이 섹션에서는 미디어를 암호화하는 두 가지 전략과 FFmpeg 및 Shaaka Packager와 함께 사용하는 방법에 관한 몇 가지 실용적인 예를 설명합니다. 설명할 두 가지 암호화 전략은 키 지우기Google Widevine과 같은 서비스를 사용하는 것입니다. 두 전략 모두 사용자가 미디어로 할 수 있는 작업을 제어하는 디지털 권한 관리 (DRM)의 한 형태입니다. 하지만 인증에 키가 전달되는 방식 때문에 DRM 서비스가 더 합리적일 수 있으므로 이 중 하나는 본질적으로 다른 것보다 보안 수준이 낮습니다.

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

변환 및 암호화는 다음 애플리케이션에서 수행됩니다.

키 암호화 지우기

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

키 만들기

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

openssl rand -hex 16 > media.key

IV 만들기

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

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

키 삭제로 암호화

다음 예에서는 원시 키가 포함된 Shaka Packager를 사용합니다. 여기서 keyskey_ids는 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은 Chrome 및 Firefox 웹브라우저, Android MediaDRM, Android TV 및 Widevine이 콘텐츠를 복호화하는 암호화된 미디어 확장 프로그램 및 미디어 소스 확장 프로그램을 사용하는 기타 가전제품 기기에서 사용됩니다.

Widevine으로 암호화

이 도움말의 대부분의 예에서는 클리어 키 암호화를 사용했습니다. 하지만 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. Demux (오디오와 동영상)를 분리하고, 새 파일을 암호화하고, 미디어 프레젠테이션 설명 (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. Remux는 오디오와 동영상 스트림을 결합 동영상 프레임워크를 사용하는 경우에는 이 방법을 사용할 필요가 없을 수도 있습니다.

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

미디어 전환 순서

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

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. Demux (오디오와 동영상)를 분리하고, 새 파일을 암호화하고, 미디어 프레젠테이션 설명 (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. Remux는 오디오와 동영상 스트림을 결합 동영상 프레임워크를 사용하는 경우에는 이 방법을 사용할 필요가 없을 수도 있습니다.

    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. Demux (오디오와 동영상)를 분리하고, 새 파일을 암호화하고, 미디어 프레젠테이션 설명 (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. Remux는 오디오와 동영상 스트림을 결합 동영상 프레임워크를 사용하는 경우에는 이 방법을 사용할 필요가 없을 수도 있습니다.

    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
    

이해하기 어려웠지만 이제 안심하고 미디어를 암호화할 수 있기를 바랍니다. 다음으로 사이트에 미디어를 추가하는 방법을 알아보겠습니다.