미디어 암호화

Derek Herman
Derek Herman
Joe Medley
Joe Medley

이 섹션에서는 미디어를 암호화하기 위한 두 가지 전략을 다루고, 이를 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 암호화

지금까지 Clear Key 암호화가 무엇이며 언제 사용해야 하는지 알아보았습니다. 그렇다면 보안 강화를 위해 언제 DRM 서비스를 사용해야 할까요? 여기서 Widevine 또는 다른 서비스를 사용하여 미디어를 안전하게 암호화하고 복호화합니다 Widevine은 MPEG-DASH 및 HLS를 지원하며 Google의 DRM입니다. Widevine은 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. 오디오와 동영상을 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 (1920x1080) 해상도에서 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
    

이해하기가 어렵지만 이제 자신 있게 미디어를 암호화할 수 있기를 바랍니다. 다음은 사이트에 미디어를 추가하는 방법입니다.