이 섹션에서는 미디어를 암호화하는 두 가지 전략과 FFmpeg 및 Shaka Packager에서 이를 사용하는 방법에 관한 몇 가지 실용적인 예를 다룹니다. 이 강의에서는 Clear Key와 Google 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로 암호화
다음 예에서는 keys
및 key_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 문서에서 자세한 예시를 확인하세요.
오디오와 동영상을 디뮤싱 (분리)하고 새 파일을 암호화한 다음 미디어 프레젠테이션 설명 (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"
오디오 및 동영상 스트림을 리믹스 (결합)합니다. 동영상 프레임워크를 사용하는 경우 이 작업을 하지 않아도 됩니다.
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
미디어 변환 시퀀스
이 섹션에서는 원시 .mov
파일에서 DASH 또는 HLS용으로 패키징된 암호화된 애셋으로 이동하는 데 필요한 명령어를 순서대로 보여줍니다. 설명을 위해 소스 파일을 1080p (1920x1080) 해상도에서 비트 전송률 8Mbs로 변환합니다. 필요에 따라 이 값을 조정합니다.
DASH/WebM
파일 형식과 코덱을 변환합니다.
이 명령어에서는 오디오 코덱에
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
Clear Key 암호화 키를 만듭니다.
openssl rand -hex 16 > media.key
오디오와 동영상을 디뮤싱 (분리)하고 새 파일을 암호화한 다음 미디어 프레젠테이션 설명 (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
오디오 및 동영상 스트림을 리믹스 (결합)합니다. 동영상 프레임워크를 사용하는 경우 이 작업을 하지 않아도 됩니다.
ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
DASH/MP4
파일 형식, 동영상 코덱, 비트 전송률을 변환합니다.
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
Clear Key 암호화 키를 만듭니다.
openssl rand -hex 16 > media.key
오디오와 동영상을 디뮤싱 (분리)하고 새 파일을 암호화한 다음 미디어 프레젠테이션 설명 (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
오디오 및 동영상 스트림을 리믹스 (결합)합니다. 동영상 프레임워크를 사용하는 경우 이 작업을 하지 않아도 됩니다.
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
HLS/MP4
HLS는 MP4만 지원하므로 먼저 MP4 컨테이너 및 지원되는 코덱으로 변환해야 합니다.
파일 형식, 동영상 코덱, 비트 전송률을 변환합니다.
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
Clear Key 암호화 키를 만듭니다.
openssl rand -hex 16 > media.key
키 정보 파일 만들기
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
다소 많은 내용이었지만 이제 자신 있게 미디어를 암호화할 수 있기를 바랍니다. 다음으로 사이트에 미디어를 추가하는 방법을 알아보겠습니다.