디지털 권한 관리 및 콘텐츠 보호를 위한 암호화 구성

디지털 권한 관리(DRM) 및 콘텐츠 보호를 지원하려면 Transcoder API를 사용하여 출력 동영상의 암호화를 구성하세요. 현재 버전의 Transcoder API는 Google Widevine 및 Microsoft PlayReady의 공통 암호화(CENC) DRM과 Apple FairPlay DRM 및 AES-128 콘텐츠 보호를 지원합니다. Transcoder API는 콘텐츠 암호화만 담당합니다.

시작하기 전에

암호화를 위해 콘텐츠를 Transcoder API에 업로드하기 전에 임의의 128비트 키(32개의 16진수 문자)를 생성하고 저장할 방법이 필요합니다. Transcoder API는 이 키를 사용하여 컨테이너에 따라 콘텐츠를 암호화합니다. 키가 DRM 제공업체의 라이선스 정책에 등록되어 있는지 확인합니다. 그러면 플레이어가 나중에 콘텐츠를 복호화할 수 있습니다. 콘텐츠 암호화는 다음 컨테이너에서 지원됩니다.

유형 기술 형식 동영상 코덱 오디오 코덱
H.264 H.265 AAC
DRM FairPlay HLS TS(SAMPLE-AES) fMP4(SAMPLE-AES) TS(SAMPLE-AES)
fMP4(SAMPLE-AES) fMP4(SAMPLE-AES)
DRM Widevine, PlayReady DASH fMP4(MPEG-CENC) fMP4(MPEG-CENC)
DRM Widevine, PlayReady HLS fMP4(MPEG-CENC) fMP4(MPEG-CENC)
콘텐츠 보호 AES-128 HLS, DASH fMP4, TS(AES-128) fMP4, TS(AES-128) fMP4, TS(AES-128)

Google Widevine 및 Microsoft PlayReady는 HTTP 동적 적응형 스트리밍(DASH) 및 HTTP 실시간 스트리밍(HLS) 프로토콜을 모두 지원합니다. 이러한 프로토콜에 대한 기기 지원은 다양합니다(예: HLS 및 DASH는 Android 및 웹에서 지원되지만 iOS에서는 HLS만 지원됨). 이러한 프로토콜의 출력은 CENC 표준(ISO/IEC 23001-7:2016 for ISO-BMFF 프래그먼트)을 사용하여 암호화됩니다. 특히 암호화 스키마는 AES-128 CTR이어야 합니다.

Apple FairPlay는 HLS 프로토콜을 사용합니다. 이 프로토콜의 출력은 SAMPLE-AES CBC를 사용하여 암호화됩니다. 이 출력에 대한 자세한 내용은 HTTP 실시간 스트리밍용 MPEG-2 스트림 암호화 형식을 참조하세요.

콘텐츠 보호

AES-128은 DASH 또는 HLS를 지원하며 CTR 또는 CBC 모드를 사용하여 암호화됩니다.

출력 컨테이너 선택

Transcoder API는 다음 컨테이너를 지원합니다.

  • TS(AES-128 CBC 스키마 사용):
    • SAMPLE-AES를 포함하는 HLS
    • (AES-128 CTR 또는 AES-128 CBC)를 포함하는 HLS
  • fMP4:
    • HLS
      • SAMPLE-AES
    • DASH
      • MPEG-CENC
      • 스키마: AES-128 CTR 또는 AES-128 CBC

다중화 출력 스트림 만들기

작업 구성의 muxStreams 목록에 출력 스트림을 추가합니다. Encryption 객체를 사용하여 암호화 설정을 구성합니다.

다음은 TS 출력 파일 컨테이너의 REST/JSON 예시입니다.

"muxStreams": [
  {
    "key": "360p-my-video-ts",
    "fileName": "360p-my-video.ts",
    "container": "ts",
    "elementaryStreams": [
      "video-stream0",
      "audio-stream0"
    ],
    "encryption": {
      "key": "aabbccddeeff11223344556677889900",
      "iv": "00112233445566778899aabbccddeeff",
      "sampleAes": {
        "keyUri": "skd://00112233445566778899aabbccddeeff"
      }
    }
  }
]

다음은 fMP4 출력 컨테이너의 REST/JSON 예시입니다.

"muxStreams": [
  {
    "key": "360p-my-video-fmp4",
    "container": "fmp4",
    "elementaryStreams": [
      "video-stream0"
    ],
    "fileName": "360p-my-video.fmp4",
    "encryption": {
      "key": "aabbccddeeff11223344556677889900",
      "iv": "00112233445566778899aabbccddeeff",
      "sampleAes": {
        "keyUri": "skd://00112233445566778899aabbccddeeff"
      }
    }
  },
  {
    "key": "360p-my-audio-fmp4",
    "container": "fmp4",
    "elementaryStreams": [
      "audio-stream0"
    ],
    "fileName": "360p-my-audio.fmp4",
    "encryption": {
      "key": "aabbccddeeff11223344556677889900",
      "iv": "00112253445566778899aabbccddeeff",
      "sampleAes": {
        "keyUri": "skd://00112233445566778899aabbccddeeff"
      }
    }
  }
]

출력 스트림을 매니페스트 파일에 추가

다음은 TS 출력 파일 컨테이너의 REST/JSON 예시입니다.

"manifests": [
  {
    "fileName": "manifest.m3u8",
    "type": "HLS",
    "muxStreams": [
      "360p-my-video-ts"
    ]
  }
]

다음은 fMP4 출력 컨테이너의 REST/JSON 예시입니다.

"manifests": [
  {
    "fileName": "main-cbcs.mpd",
    "type": "DASH",
    "muxStreams": [
      "360p-my-audio-fmp4",
      "360p-my-video-fmp4"
    ]
  }
]

v1 구성으로 마이그레이션

이 섹션의 단계에 따라 비공개 미리보기 작업 구성이 v1 암호화 형식을 지원하도록 업데이트합니다.

기존 암호화 구성은 muxStreams 필드 자체에서 mux 스트림의 암호화 세부정보를 제공합니다(다음 참조).

{
  ...
  "muxStreams": [
    {
      "key": "360p-my-video-ts",
      "fileName": "360p-my-video.ts",
      "container": "ts",
      "elementaryStreams": [
        "video-stream0",
        "audio-stream0"
      ],
      "encryption": {
        "key": "aabbccddeeff11223344556677889900",
        "iv": "10314849f4a110ad4abacdb6f5f4b86f",
        "sampleAes": {
          "keyUri": "skd://10314849f4a110ad4abacdb6f5f4b86f"
        }
      }
    },
    {
      "key": "360p-my-video-fmp4",
      "container": "fmp4",
      "elementaryStreams": [
        "video-stream0"
      ],
      "fileName": "360p-my-video.fmp4",
      "encryption": {
        "key": "11223344556677889900aabbccddeeff",
        "iv": "179b08b91372aa26e0763e87743db388",
        "mpegCenc": {
          "keyId": "skd://179b08b91372aa26e0763e87743db388",
          "scheme": "cenc"
        }
      }
    },
    {
      "key": "360p-my-audio-fmp4",
      "container": "fmp4",
      "elementaryStreams": [
        "audio-stream0"
      ],
      "fileName": "360p-my-audio.fmp4",
      "encryption": {
        "key": "11223344556677889900aabbccddeeff",
        "iv": "179b08b91372aa26e0763e87743db388",
        "mpegCenc": {
          "keyId": "skd://179b08b91372aa26e0763e87743db388",
          "scheme": "cenc"
        }
      }
    }
  ]
  ...
}

이제 암호화 설정이 다음과 같이 두 부분으로 나뉩니다.

  1. 암호화 키: 이제 키가 Secret Manager에 저장됩니다.
  2. 암호화 구성 및 설정: 작업 구성의 새 필드입니다.

다음 단계에 따라 비공개 미리보기 암호화 설정을 v1 형식으로 업데이트합니다.

  1. 기존 작업 구성에 포함된 암호화 키를 포함하는 보안 비밀을 만듭니다. 보안 비밀의 리소스 ID를 기록해 둡니다. 자세한 내용은 Secret Manager에 암호화 키 추가를 참조하세요.

    ...
    {
      "encryptionKeys": [
        {
          "key": "aabbccddeeff11223344556677889900",
          "keyId": "10314849f4a110ad4abacdb6f5f4b86f",
          "keyUri": "skd://10314849f4a110ad4abacdb6f5f4b86f",
          "iv": "10314849f4a110ad4abacdb6f5f4b86f",
          "matchers": [
            {
              "muxStreams": [
                "360p-my-video-ts"
              ]
            }
          ]
        },
        {
          "key": "11223344556677889900aabbccddeeff",
          "keyId": "179b08b91372aa26e0763e87743db388",
          "keyUri": "skd://179b08b91372aa26e0763e87743db388",
          "iv": "179b08b91372aa26e0763e87743db388",
          "matchers": [
            {
              "muxStreams": [
                "360p-my-video-fmp4",
                "360p-my-audio-fmp4"
              ]
            }
          ]
        }
      ]
    }
    ...
    
  2. 기존 작업 구성에서 각 암호화 설정에 대한 암호화 필드 메시지를 만듭니다. 자세한 내용은 서비스 만들기를 참조하세요.

    ...
    "encryptions": [
        {
          "id": "ts_sampleaes",
          "secretManagerKeySource": { // resource for the secret created in the preceding step
            "secretVersion": "projects/{project}/secrets/{secret_id}/versions/{version_number}"
          },
          "drmSystems": {
            "fairplay": {}
          },
          "sampleAes": {}
        },
        {
          "id": "fmp4_mpegcenc_cenc",
          "secretManagerKeySource": { // resource for the secret created in the preceding step
            "secretVersion": "projects/{project}/secrets/{secret_id}/versions/{version_number}"
          },
          "drmSystems": {
            "widevine": {},
            "playready": {}
          },
          "mpegCenc": {
            "scheme": "cbcs"
          }
        }
      ]
    ...
    
  3. 암호화 필드를 삭제하고 대신 이전 단계에서 만든 암호화 설정의 encryptionId를 사용하여 muxStreams에서 mux 스트림을 업데이트합니다.

    {
      ...
      "muxStreams": [
        {
          "key": "360p-my-video-ts",
          "fileName": "360p-my-video.ts",
          "container": "ts",
          "elementaryStreams": [
            "video-stream0",
            "audio-stream0"
          ],
          "encryptionId": "ts_sampleaes"
        },
        {
          "key": "360p-my-video-fmp4",
          "container": "fmp4",
          "elementaryStreams": [
            "video-stream0"
          ],
          "fileName": "360p-my-video.fmp4",
          "encryptionId": "fmp4_mpegcenc_cenc"
        },
        {
          "key": "360p-my-audio-fmp4",
          "container": "fmp4",
          "elementaryStreams": [
            "audio-stream0"
          ],
          "fileName": "360p-my-audio.fmp4",
          "encryptionId": "fmp4_mpegcenc_cenc"
        }
      ]
      ...
    }
    

자세한 내용은 트랜스코딩된 콘텐츠 암호화를 참조하세요.