All Products
Search
Document Center

ApsaraVideo VOD:Enkripsi HLS

Last Updated:Jul 11, 2026

Enkripsi HLS menggunakan AES-128 dan kompatibel dengan semua pemutar HLS. Dikombinasikan dengan manajemen kunci dan layanan token, fitur ini cocok untuk skenario keamanan tinggi seperti pendidikan daring dan streaming konten eksklusif.

Cara kerja

ApsaraVideo VOD menggunakan enkripsi amplop. Penyedia layanan menggunakan Alibaba Cloud Key Management Service (KMS) untuk menghasilkan kunci data (DK) dan kunci data terbungkus (EDK). DK digunakan untuk mengenkripsi video, sedangkan EDK disimpan bersama video tersebut. Saat pemutaran, klien mengambil DK dari layanan dekripsi untuk mendekripsi video.

Untuk mengamankan URL dekripsi, aktifkan Enkripsi dan penulisan ulang M3U8, yang menambahkan lapisan perlindungan tambahan pada proses akses data HLS. Parameter penulisan ulang default adalah MtsHlsUriToken. Untuk mempelajari cara mengaktifkan fitur ini dan cara kerjanya, lihat Enkripsi dan penulisan ulang M3U8.

Prasyarat

  • Enkripsi HLS adalah layanan gratis. Namun, fitur ini memerlukan transkoding video, yang dikenai biaya. Untuk detail harga, lihat Penagihan transkoding media.

  • Anda telah mengaktifkan ApsaraVideo VOD. Untuk petunjuknya, lihat Aktifkan ApsaraVideo VOD.

  • Anda telah memberi otorisasi kepada ApsaraVideo VOD untuk mengakses Key Management Service (KMS) Anda. Anda dapat memberikan izin yang diperlukan di halaman Otorisasi Akses Sumber Daya Cloud.

  • Anda telah menambahkan nama domain yang dipercepat di ApsaraVideo VOD. Untuk petunjuknya, lihat Tambahkan nama domain yang dipercepat.

  • Anda telah menginstal SDK sisi server yang diperlukan. Untuk informasi selengkapnya, lihat SDK sisi server. Topik ini menggunakan SDK untuk Java sebagai contoh.

Konsep utama

Konsep

Deskripsi

Resource Access Management (RAM)

Layanan Alibaba Cloud yang memungkinkan Anda mengelola identitas pengguna dan mengontrol akses ke sumber daya Anda. Untuk informasi selengkapnya, lihat Apa itu RAM.

Key Management Service (KMS)

Platform Alibaba Cloud satu atap untuk manajemen kunci dan enkripsi data. Layanan ini menyediakan solusi yang sederhana, andal, aman, dan sesuai regulasi untuk melindungi data dan mengelola kredensial Anda. Untuk informasi selengkapnya, lihat Apa itu Key Management Service.

Data key (DK)

Kunci teks biasa yang digunakan untuk mengenkripsi data. Untuk informasi selengkapnya, lihat Istilah.

Enveloped data key (EDK)

Kunci data terenkripsi yang dilindungi oleh enkripsi amplop. Untuk informasi selengkapnya, lihat Istilah.

Alur kerja enkripsi dan dekripsi

Alur kerja unggah dan enkripsi

视频安全-HLS标准加密3

Alur kerja dekripsi dan pemutaran

Penulisan ulang M3U8 diaktifkan (Direkomendasikan)

视频安全-HLS标准加密6..png

Penulisan ulang M3U8 dinonaktifkan

视频安全-HLS标准加密2

Enkripsi video

  1. Unggah video Anda dan terima callback.

    Untuk mencegah video yang mendukung Enkripsi HLS agar tidak ditranskode secara otomatis, Anda harus menggunakan kelompok templat bawaan No Transcoding saat mengunggah video ke ApsaraVideo VOD. Hal ini mencegah transkoding otomatis selama proses unggah.

    1. Untuk mengunggah video menggunakan Konsol ApsaraVideo VOD, lihat Unggah file di Konsol ApsaraVideo VOD. Untuk mengunggah video menggunakan API sisi server, lihat Unggah media.

    2. Konfigurasikan notifikasi event untuk ApsaraVideo VOD. Pesan callback untuk event Video upload completed menunjukkan bahwa video telah berhasil diunggah ke ApsaraVideo VOD. Untuk informasi selengkapnya tentang cara mengonfigurasi notifikasi event, lihat Notifikasi event.

  2. Siapkan layanan enkripsi.

    1. Buat kunci layanan.

      Kunci layanan adalah kunci enkripsi utama di KMS dan harus digunakan untuk menghasilkan kunci bagi Enkripsi HLS. Jika Anda tidak membuat kunci layanan, operasi GenerateKMSDataKey akan mengembalikan error.

      1. Di pojok kiri atas halaman, klik ID wilayah untuk beralih ke wilayah tempat Anda ingin membuat kunci layanan.

        Catatan

        Kunci layanan harus berada di wilayah yang sama dengan server origin video Anda. Misalnya, jika video Anda disimpan di China (Shanghai), kunci layanan juga harus dibuat di wilayah China (Shanghai).

        Wilayah yang tersedia adalah China (Shanghai), China (Beijing), China (Shenzhen), Jepang (Tokyo), Singapura, Indonesia (Jakarta), India (Mumbai), dan Jerman (Frankfurt).

      2. Masuk ke Konsol ApsaraVideo VOD. Di panel navigasi sebelah kiri, pilih Configuration Management > Media Processing > HLS Standard Encryption.

      3. Di halaman Enkripsi HLS, klik Create Service Key.

        Setelah kunci layanan dibuat, pesan konfirmasi akan muncul. Anda kemudian dapat melihat kunci tersebut di bagian Key Information.

        Catatan

        Jika muncul pesan sukses tetapi Anda tidak dapat melihat kuncinya, penyebabnya mungkin karena peran terkait layanan belum ada. Anda dapat memberikan otorisasi ulang kepada ApsaraVideo VOD untuk memulihkan peran tersebut, lalu refresh halaman untuk melihat kunci layanan.

    2. Panggil operasi API untuk menghasilkan kunci data (DK).

      Panggil operasi GenerateKMSDataKey untuk menghasilkan kunci data (DK) dan kunci data terbungkus (EDK). Anda tidak perlu mengirimkan parameter apa pun. Setelah panggilan berhasil, bidang Plaintext dalam respons berisi DK, dan bidang CiphertextBlob berisi EDK dalam format AES-128. Simpan nilai CiphertextBlob untuk pekerjaan transkoding Enkripsi HLS.

  3. Buat kelompok templat transkoding untuk Enkripsi HLS.

    Proses Enkripsi HLS memerlukan dua kelompok templat transkoding: kelompok templat bawaan No Transcoding dan kelompok templat transkoding kustom untuk Enkripsi HLS. Untuk membuat kelompok templat transkoding kustom, lakukan langkah-langkah berikut:

    1. Masuk ke Konsol ApsaraVideo VOD. Di panel navigasi sebelah kiri, pilih Configuration Management > Media Processing > Transcoding Template Groups.

    2. Di halaman Kelompok Templat Transkoding, buat kelompok templat transkoding untuk Enkripsi HLS.

      Atur Encapsulation Format menjadi hls. Di bagian Advanced Parameters, aktifkan Video Encryption dan pilih opsi Alibaba Cloud Encryption. Konfigurasikan parameter lain sesuai kebutuhan. Untuk informasi selengkapnya tentang parameter tersebut, lihat Templat transkoding.

    3. Setelah kelompok templat dibuat, temukan kelompok templat baru tersebut dalam daftar di halaman Kelompok Templat Transkoding dan catat ID-nya. ID kelompok templat ini diperlukan untuk konfigurasi enkripsi.

  4. Kirimkan pekerjaan transkoding Enkripsi HLS.

    1. Panggil operasi SubmitTranscodeJobs untuk mengirimkan pekerjaan transkoding Enkripsi HLS.

      Kode contoh Java

      Dalam kode contoh Java berikut, ubah parameter berikut sesuai kebutuhan Anda:

      Parameter

      Nilai

      request.setTemplateGroupId("")

      ID kelompok templat transkoding untuk Enkripsi HLS yang Anda buat di Langkah 3.

      request.setVideoId("")

      ID video yang Anda unggah di Langkah 1.

      encryptConfig.put("CipherText","")

      Nilai CiphertextBlob yang dikembalikan di Langkah 2.

      encryptConfig.put("DecryptKeyUri","")

      URI kunci. URI ini dibuat dengan menggabungkan URL layanan dekripsi dan nilai CiphertextBlob. Misalnya, jika layanan Anda berjalan di port 8099 secara lokal, URI kuncinya adalah sebagai berikut:

      http://172.16.0.1:8099?CipherText=CiphertextBlobValue

      import com.alibaba.fastjson.JSON;
      import com.alibaba.fastjson.JSONObject;
      import com.aliyuncs.DefaultAcsClient;
      import com.aliyuncs.exceptions.ClientException;
      import com.aliyuncs.profile.DefaultProfile;
      import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsRequest;
      import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsResponse;
      public class SubmitTranscodeJobs {
          // Pasangan AccessKey akun Alibaba Cloud memiliki izin untuk memanggil semua operasi API. Kami menyarankan Anda menggunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin.
          // Kami sangat menyarankan agar Anda tidak menyematkan ID AccessKey dan Rahasia AccessKey secara langsung dalam kode proyek Anda. Jika tidak, pasangan AccessKey tersebut dapat bocor dan keamanan semua sumber daya Anda dapat terganggu.
          // Contoh ini menunjukkan cara menggunakan variabel lingkungan untuk mendapatkan pasangan AccessKey guna autentikasi. Sebelum menjalankan kode contoh, konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET.
          private static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
          private static String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
          public static SubmitTranscodeJobsResponse submitTranscodeJobs(DefaultAcsClient client) throws Exception{
              SubmitTranscodeJobsRequest request = new SubmitTranscodeJobsRequest();
              request.setTemplateGroupId("");
              request.setVideoId("");
              JSONObject encryptConfig = new JSONObject();
              encryptConfig.put("CipherText","");
              encryptConfig.put("DecryptKeyUri","");
              encryptConfig.put("KeyServiceType","KMS");
              request.setEncryptConfig(encryptConfig.toJSONString());
              return client.getAcsResponse(request);
          }
          public static void main(String[] args) throws ClientException {
              String regionId = "cn-shanghai";  // Wilayah untuk ApsaraVideo VOD.
              DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
              DefaultAcsClient client = new DefaultAcsClient(profile);
              SubmitTranscodeJobsResponse response;
              try {
                  response = submitTranscodeJobs(client);
                  System.out.println("RequestId is:"+response.getRequestId());
                  System.out.println("TranscodeTaskId is:"+response.getTranscodeTaskId());
                  System.out.println("TranscodeJobs is:"+ JSON.toJSON(response.getTranscodeJobs()));
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }       
    2. Jika Anda telah mengonfigurasi notifikasi event, pesan callback untuk event Single Definition Transcoding Complete atau Transcode complete menunjukkan bahwa pekerjaan transkoding telah selesai.

  5. Verifikasi hasil Enkripsi HLS.

    Setelah pekerjaan transkoding selesai, gunakan salah satu metode berikut untuk memverifikasi enkripsi.

    • Metode 1: Masuk ke Konsol ApsaraVideo VOD. Buka halaman detail file Audio/Video dan klik tab Video URL. Di daftar URL video, periksa kolom format untuk tag HLS Encryption pada file output M3U8. Kehadiran tag ini mengonfirmasi bahwa enkripsi berhasil.

    • Metode 2: Salin URL file M3U8 yang memiliki tag HLS Standard Encryption. Jalankan perintah curl -v "URL file M3U8" untuk mengambil konten M3U8. Periksa konten tersebut untuk informasi kunci berikut: URI="<URI dekripsi yang Anda berikan sebagai nilai parameter DecryptKeyUri>". Jika informasi ini ada, enkripsi berhasil.

    • Metode 3: Panggil operasi GetTranscodeTask dan masukkan nilai parameter JobId yang dikembalikan di Langkah 4. Enkripsi berhasil jika nilai TranscodeTemplateId dalam respons sesuai dengan ID kelompok templat transkoding yang Anda buat di Langkah 3 dan TranscodeJobStatus bernilai TranscodeSuccess.

Enkripsi HLS (M3U8) dan penulisan ulang (Direkomendasikan)

Dengan Enkripsi dan penulisan ulang M3U8 diaktifkan, sistem secara otomatis menambahkan parameter enkripsi, termasuk algoritma, URI kunci, dan parameter autentikasi, ke tag #EXT-X-KEY dalam Daftar Putar Media HLS (file M3U8). Saat klien mengurai file M3U8 yang ditulis ulang, klien tersebut menggunakan URI kunci dengan parameter autentikasi untuk meminta kunci dekripsi, lalu mendekripsi segmen transport stream (TS) dengan algoritma yang ditentukan.

Langkah 1: Aktifkan transmisi parameter untuk enkripsi HLS

Di Konsol ApsaraVideo VOD, aktifkan Parameter Pass-through for HLS Encryption.

Setelah Anda mengaktifkan Parameter Pass-through for HLS Encryption, ApsaraVideo VOD menulis ulang file M3U8, memodifikasi URI di tag #EXT-X-KEY dengan menambahkan parameter dari permintaan klien. Nama parameter default adalah MtsHlsUriToken.

Prasyarat

Anda telah mengonfigurasi Berbagi sumber daya lintas asal (CORS). Untuk informasi selengkapnya, lihat Konfigurasi Berbagi sumber daya lintas asal.

Penting

Fitur ini tidak tersedia di Alibaba Cloud Gov Cloud.

Prosedur

  1. Masuk ke Konsol ApsaraVideo VOD.

  2. Di panel navigasi sebelah kiri, klik Configuration Management.

  3. Klik CDN Configuration > Domain Names untuk membuka halaman Domain Names.

  4. Temukan nama domain yang ingin Anda kelola dan klik configure di kolom Actions.

  5. Di halaman konfigurasi domain, klik Video Related di panel navigasi sebelah kiri.

  6. Di bagian encrypted playback, aktifkan sakelar Parameter Pass-through for HLS Encryption. Secara default, sakelar ini dimatikan, dan nama parameternya adalah MtsHlsUriToken.

Catatan
  • Setelah Anda mengaktifkan fitur ini, ApsaraVideo VOD menangani autentikasi dengan menulis ulang parameter token. Parameter yang ditulis ulang adalah MtsHlsUriToken, dan nilainya adalah test. Selama pemutaran terdekripsi, Titik kehadiran (POP) menambahkan MtsHlsUriToken=test ke URI di tag #EXT-X-KEY file M3U8.

Langkah 2: Kirim permintaan dengan MtsHlsUriToken

Untuk mengakses file M3U8, klien mengirim permintaan yang mencakup parameter MtsHlsUriToken ke Titik kehadiran (POP).

Anda harus membangun layanan token untuk menghasilkan dan menerbitkan MtsHlsUriToken bagi pengguna.

Kode berikut menghasilkan MtsHlsUriToken. Anda harus mengubah parameter berikut sesuai kebutuhan bisnis Anda:

Kode contoh Java

Parameter

Deskripsi

ENCRYPT_KEY

Kunci enkripsi. String kustom dengan panjang 16, 24, atau 32 karakter.

INIT_VECTOR

Offset enkripsi. String kustom sepanjang 16 karakter yang tidak boleh mengandung karakter khusus.

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Arrays;
public class PlayToken {
    // Parameter-parameter ini hanya diperlukan untuk pembuatan token AES.
    private static String ENCRYPT_KEY = "";
    private static String INIT_VECTOR = "";
    public static void main(String[] args) throws Exception {
        String serviceId = "12";
        PlayToken playToken = new PlayToken();
        String aesToken = playToken.generateToken(serviceId);
        //System.out.println("aesToken " + aesToken);
        //System.out.println(playToken.validateToken(aesToken));   // Verifikasi dekripsi.
    }
    /**
     * Menghasilkan token berdasarkan parameter yang dilewatkan.
     * Catatan:
     *  1. Parameter dapat mencakup informasi seperti ID pengguna layanan Anda dan jenis klien pemutaran.
     *  2. Token dihasilkan melalui panggilan ke API layanan token Anda.
     * @param args
     * @return
     */
    public String generateToken(String... args) throws Exception {
        if (null == args || args.length <= 0) {
            return null;
        }
        String base = StringUtils.join(Arrays.asList(args), "_");
        // Atur masa berlaku token selama 30 detik. Anda dapat menyesuaikan waktu kedaluwarsanya.
        long expire = System.currentTimeMillis() + 30000L;
        base += "_" + expire;   // String kustom. Panjang akhir `base` harus 16, 24, atau 32 karakter. Dalam contoh ini, timestamp terdiri dari 13 karakter dan underscore (_) 1 karakter, sehingga Anda harus melewatkan string sepanjang 2 karakter. Anda dapat memodifikasi string ini sesuai kebutuhan.
        // Hasilkan token.
        String token = encrypt(base, ENCRYPT_KEY);  // 'encryptStr' adalah string kustom yang akan dienkripsi dan 'encryptKey' adalah kunci enkripsi.
        // Simpan token untuk divalidasi selama dekripsi, misalnya waktu kedaluwarsa dan jumlah penggunaannya.
        saveToken(token);
        return token;
    }
    /**
     * Memvalidasi token.
     * Catatan:
     *  1. Layanan dekripsi Anda harus memvalidasi legalitas dan validitas token sebelum mengembalikan kunci pemutaran.
     *  2. Kami sangat menyarankan agar Anda juga memvalidasi waktu kedaluwarsa token dan jumlah penggunaan yang valid.
     * @param token
     * @return
     * @throws Exception
     */
    public boolean validateToken(String token) throws Exception {
        if (null == token || "".equals(token)) {
            return false;
        }
        String base = decrypt(token,ENCRYPT_KEY); // 'encryptStr' adalah string yang akan didekripsi dan 'decryptKey' adalah kunci dekripsi.
        // Pertama, validasi waktu kedaluwarsa token.
        Long expireTime = Long.valueOf(base.substring(base.lastIndexOf("_") + 1));
        System.out.println("Validasi waktu: " + expireTime);
        if (System.currentTimeMillis() > expireTime) {
            return false;
        }
        // Dapatkan informasi token dari database untuk menentukan validitasnya. Anda harus mengimplementasikan bagian ini.
        TokenInfo dbToken = getToken(token);
        // Periksa apakah token telah digunakan.
        if (dbToken == null || dbToken.useCount > 0) {
            return false;
        }
        // Dapatkan informasi atribut bisnis untuk validasi.
        String businessInfo = base.substring(0, base.lastIndexOf("_"));
        String[] items = businessInfo.split("_");
        // Validasi legalitas informasi bisnis. Anda harus mengimplementasikan bagian ini.
        return validateInfo(items);
    }
    /**
     * Menyimpan token ke database.
     * Anda harus mengimplementasikan bagian ini.
     *
     * @param token
     */
    public void saveToken(String token) {
        //TODO: Simpan token.
    }
    /**
     * Mengambil token.
     * Anda harus mengimplementasikan bagian ini.
     *
     * @param token
     */
    public TokenInfo getToken(String token) {
        //TODO: Dapatkan informasi token dari database untuk pemeriksaan validitas dan legalitas.
        return null;
    }
    /**
     * Memvalidasi informasi bisnis. Anda harus mengimplementasikan bagian ini.
     *
     * @param infos
     * @return
     */
    public boolean validateInfo(String... infos) {
        //TODO: Validasi informasi, misalnya apakah UID valid.
        return true;
    }
    /**
     * Menghasilkan token menggunakan enkripsi AES.
     *
     * @param encryptStr  String yang akan dienkripsi.
     * @param encryptKey  Kunci enkripsi.
     * @return
     * @throws Exception
     */
    public String encrypt(String encryptStr, String encryptKey) throws Exception {
        IvParameterSpec e = new IvParameterSpec(INIT_VECTOR.getBytes("UTF-8"));
        SecretKeySpec skeySpec = new SecretKeySpec(encryptKey.getBytes("UTF-8"), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, e);
        byte[] encrypted = cipher.doFinal(encryptStr.getBytes());
        return Base64.encodeBase64String(encrypted);
    }
    /**
     * Mendekripsi token menggunakan AES.
     *
     * @param encryptStr  String yang akan didekripsi.
     * @param decryptKey  Kunci dekripsi.
     * @return
     * @throws Exception
     */
    public String decrypt(String encryptStr, String decryptKey) throws Exception {
        IvParameterSpec e = new IvParameterSpec(INIT_VECTOR.getBytes("UTF-8"));
        SecretKeySpec skeySpec = new SecretKeySpec(decryptKey.getBytes("UTF-8"), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, e);
        byte[] encryptByte = Base64.decodeBase64(encryptStr);
        byte[] decryptByte = cipher.doFinal(encryptByte);
        return new String(decryptByte);
    }
    /**
     * Informasi token. Anda dapat menambahkan informasi lebih lanjut berdasarkan logika bisnis Anda. Ini hanya sebagai referensi.
     */
    class TokenInfo {
        // Jumlah kali token dapat digunakan. Perhatikan masalah sinkronisasi di lingkungan terdistribusi.
        int useCount;
        // Konten token.
        String token;
    }}
                        
Catatan

Kode contoh di atas hanya sebagai referensi. Kode ini tidak melibatkan SDK atau kode layanan apa pun. Anda harus mengonfigurasi dan menyesuaikannya sesuai kebutuhan bisnis Anda.

Langkah 3: Dekripsi dan putar file

Saat menerima permintaan dari klien, Titik kehadiran (POP) melakukan autentikasi. Jika autentikasi berhasil, POP mendekripsi dan memutar file tersebut.

Jika parameter MtsHlsUriToken yang dihasilkan di Langkah 2 memiliki nilai test, POP menambahkan MtsHlsUriToken=test ke URI di tag #EXT-X-KEY file M3U8 selama pemutaran terdekripsi.

Anda harus mengimplementasikan logika autentikasi. Sebagai referensi, lihat kode contoh layanan dekripsi untuk enkripsi dan penulisan ulang M3U8 di Putar video.

Putar video

Dengan penulisan ulang M3U8 (direkomendasikan)

  1. Siapkan layanan dekripsi.

    Siapkan layanan HTTP lokal untuk mendekripsi video.

    Panggil operasi DecryptKMSDataKey untuk mendekripsi kunci data. Kunci data dalam respons, PlainText, adalah versi hasil decoding Base64 dari nilai PlainText yang dikembalikan oleh operasi GenerateKMSDataKey.

    Untuk menambahkan lapisan keamanan ekstra dengan memverifikasi URL dekripsi, aktifkan Enkripsi dan penulisan ulang M3U8. Fitur ini menambahkan token ke URL permintaan kunci. Nama parameter default adalah MtsHlsUriToken. Implementasi layanan dekripsi Anda bergantung pada apakah fitur ini diaktifkan atau tidak.

    Klik untuk memperluas kode contoh Java

    Tabel berikut menjelaskan parameter dalam kode contoh yang dapat Anda sesuaikan.

    Parameter

    Deskripsi

    region

    ID wilayah. Wilayah layanan KMS harus sama dengan wilayah tempat video ApsaraVideo VOD Anda disimpan. Misalnya, untuk China (Shanghai), atur parameter ini ke cn-shanghai. Untuk informasi selengkapnya tentang ID wilayah lainnya, lihat ID wilayah ApsaraVideo VOD.

    AccessKey

    Pasangan AccessKey (ID AccessKey dan Rahasia AccessKey) akun Alibaba Cloud atau Pengguna RAM Anda. Untuk informasi selengkapnya, lihat Buat pasangan AccessKey.

    httpserver

    Nomor port tempat Anda ingin menjalankan layanan.

    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.http.ProtocolType;
    import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyRequest;
    import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyResponse;
    import com.aliyuncs.profile.DefaultProfile;
    import com.sun.net.httpserver.Headers;
    import com.sun.net.httpserver.HttpExchange;
    import com.sun.net.httpserver.HttpHandler;
    import com.sun.net.httpserver.HttpServer;
    import com.sun.net.httpserver.spi.HttpServerProvider;
    import org.apache.commons.codec.binary.Base64;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.InetSocketAddress;
    import java.net.URI;import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class HlsDecryptServer {
        private static DefaultAcsClient client;
        static {
            // Wilayah KMS, yang harus sama dengan wilayah video.
            String region = "";
            // Pasangan AccessKey untuk mengakses KMS.
            // Pasangan AccessKey akun Alibaba Cloud memiliki izin untuk semua operasi API. Kami menyarankan Anda menggunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin.
            // Kami sangat menyarankan agar Anda tidak menyematkan ID AccessKey dan Rahasia AccessKey secara langsung dalam kode proyek Anda. Melakukannya dapat menyebabkan kebocoran pasangan AccessKey dan mengompromikan keamanan semua sumber daya di akun Anda.
            // Contoh ini menunjukkan cara mengautentikasi permintaan API dengan membaca pasangan AccessKey dari variabel lingkungan. Sebelum menjalankan kode contoh, konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET.
            String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            client = new DefaultAcsClient(DefaultProfile.getProfile(region, accessKeyId, accessKeySecret));
        }
        /**
         * Deskripsi:
         * 1. Menerima permintaan dekripsi untuk mendapatkan ciphertext dan token pengguna.
         * 2. Memanggil operasi dekripsi KMS untuk mendapatkan kunci plaintext.
         * 3. Mengembalikan kunci plaintext hasil decoding Base64.
         */
        public class HlsDecryptHandler implements HttpHandler {
            /**
             * Menangani permintaan dekripsi.
             * @param httpExchange
             * @throws IOException
             */
            public void handle(HttpExchange httpExchange) throws IOException {
                String requestMethod = httpExchange.getRequestMethod();
                if ("GET".equalsIgnoreCase(requestMethod)) {
                    // Verifikasi validitas token.
                    String token = getMtsHlsUriToken(httpExchange);
                    boolean validRe = validateToken(token);
                    if (!validRe) {
                        return;
                    }
                    // Dapatkan ciphertext dari URL.
                    String ciphertext = getCiphertext(httpExchange);
                    if (null == ciphertext)
                        return;
                    // Dekripsi kunci dari KMS dan lakukan decoding Base64.
                    byte[] key = decrypt(ciphertext);
                    // Atur header.
                    setHeader(httpExchange, key);
                    // Kembalikan kunci hasil decoding Base64.
                    OutputStream responseBody = httpExchange.getResponseBody();
                    responseBody.write(key);
                    responseBody.close();
                }
            }
            private void setHeader(HttpExchange httpExchange, byte[] key) throws IOException {
                Headers responseHeaders = httpExchange.getResponseHeaders();
                responseHeaders.set("Access-Control-Allow-Origin", "*");
                httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, key.length);
            }
            /**
             * Memanggil operasi dekripsi KMS dan melakukan decoding Base64 pada plaintext.
             * @param ciphertext
             * @return
             */
            private byte[] decrypt(String ciphertext) {
                DecryptKMSDataKeyRequest request = new DecryptKMSDataKeyRequest();
                request.setCipherText(ciphertext);
                request.setProtocol(ProtocolType.HTTPS);
                try {
                    DecryptKMSDataKeyResponse response = client.getAcsResponse(request);
                    String plaintext = response.getPlaintext();
                    System.out.println("PlainText: " + plaintext);
                    // Catatan: Diperlukan decoding Base64.
                    return Base64.decodeBase64(plaintext);
                } catch (ClientException e) {
                    e.printStackTrace();
                    return null;
                }
            }
            /**
             * Mendapatkan parameter ciphertext dari URL.
             * @param httpExchange
             * @return
             */
            private String getCiphertext(HttpExchange httpExchange) {
                URI uri = httpExchange.getRequestURI();
                String queryString = uri.getQuery();
                String pattern = "CipherText=(\\w*)";
                Pattern r = Pattern.compile(pattern);
                Matcher m = r.matcher(queryString);
                if (m.find())
                    return m.group(1);
                else {
                    System.out.println("Parameter CipherText Tidak Ditemukan");
                    return null;
                }
            }
              /**
             * Memverifikasi validitas token. Ini diperlukan untuk enkripsi dan penulisan ulang M3U8.
             * @param token
             * @return
             */
            private boolean validateToken(String token) {
                if (null == token || "".equals(token)) {
                    return false;
                }
                //TODO: Implementasikan logika validasi token Anda di sini.
                return true;
            }
            /**
             * Mendapatkan parameter token. Ini diperlukan untuk enkripsi dan penulisan ulang M3U8.
             *
             * @param httpExchange
             * @return
             */
            private String getMtsHlsUriToken(HttpExchange httpExchange) {
                URI uri = httpExchange.getRequestURI();
                String queryString = uri.getQuery();
                String pattern = "MtsHlsUriToken=(\\w*)";
                Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(queryString);
                if (m.find())
                    return m.group(1);
                else {
                    System.out.println("Parameter MtsHlsUriToken Tidak Ditemukan");
                    return null;
                }
            }
        }
        /**
         * Menjalankan layanan.
         *
         * @throws IOException
         */
        private void serviceBootStrap() throws IOException {
            HttpServerProvider provider = HttpServerProvider.provider();
            // Port pendengar dapat disesuaikan. Server dapat menerima hingga 30 permintaan konkuren.
            HttpServer httpserver = provider.createHttpServer(new InetSocketAddress(8099), 30);
            httpserver.createContext("/", new HlsDecryptHandler());
            httpserver.start();
            System.out.println("server dekripsi hls dimulai");
        }
        public static void main(String[] args) throws IOException {
            HlsDecryptServer server = new HlsDecryptServer();
            server.serviceBootStrap();
        }}
  2. Dapatkan URL pemutaran video atau kredensial.

    Panggil operasi GetVideoPlayAuth untuk mendapatkan kredensial pemutaran, atau panggil operasi GetPlayInfo untuk mendapatkan URL pemutaran.

  3. Mainkan video terenkripsi.

    Enkripsi standar HLS kompatibel dengan semua pemutar HLS. Anda dapat menggunakan pemutar buatan sendiri atau Pemutar Video Apsara untuk memutar video terenkripsi.

    Jika Anda menggunakan Pemutar Video Apsara, dapatkan token dan informasi autentikasi yang diperlukan untuk memutar video. Untuk informasi selengkapnya, lihat Putar video terenkripsi. Jika Anda menggunakan pemutar lain, implementasikan logika pemutaran.

    Bagian berikut menjelaskan proses pemutaran internal Pemutar Video Apsara:

    Dengan penulisan ulang M3U8 (direkomendasikan)

    Alur kerja

    • Pemutar mengurai tag EXT-X-KEY dalam file M3U8 untuk mendapatkan URI kunci dekripsi. URI ini sesuai dengan nilai parameter DecryptKeyUri di EncryptConfig.

    • Untuk membatasi akses tidak sah, pemutar harus menyertakan informasi autentikasi (dilewatkan dalam parameter MtsHlsUriToken) dalam permintaan ke titik akhir dekripsi.

    • Pemutar secara otomatis meminta titik akhir dekripsi untuk mendapatkan kunci, mendekripsi file TS, lalu memutar video.

    Contoh

    • Jika URL pemutaran adalah https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8, permintaan harus menyertakan parameter MtsHlsUriToken.

    • URL permintaan akhir: https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8?MtsHlsUriToken=<token>

    • URL dekripsi: https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****

    • URL permintaan dekripsi akhir: https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk7MTMtOT****&MtsHlsUriToken=<token>

Tanpa penulisan ulang M3U8

  1. Siapkan layanan dekripsi.

    Siapkan layanan HTTP lokal untuk mendekripsi video.

    Panggil operasi DecryptKMSDataKey untuk mendekripsi kunci data. Kunci data dalam respons, PlainText, adalah versi hasil decoding Base64 dari nilai PlainText yang dikembalikan oleh operasi GenerateKMSDataKey.

    Sebagai contoh:

    Klik untuk memperluas kode contoh Java

    Tabel berikut menjelaskan parameter dalam kode contoh yang dapat Anda sesuaikan.

    Parameter

    Deskripsi

    region

    ID wilayah. Wilayah layanan KMS harus sama dengan wilayah tempat video ApsaraVideo VOD Anda disimpan. Misalnya, untuk China (Shanghai), atur parameter ini ke cn-shanghai. Untuk informasi selengkapnya tentang ID wilayah lainnya, lihat ID wilayah ApsaraVideo VOD.

    AccessKey

    Pasangan AccessKey (ID AccessKey dan Rahasia AccessKey) akun Alibaba Cloud atau Pengguna RAM Anda. Untuk informasi selengkapnya, lihat Buat pasangan AccessKey.

    httpserver

    Nomor port tempat Anda ingin menjalankan layanan.

    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.http.ProtocolType;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyRequest;
    import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyResponse;
    import com.sun.net.httpserver.Headers;
    import com.sun.net.httpserver.HttpExchange;
    import com.sun.net.httpserver.HttpHandler;
    import com.sun.net.httpserver.HttpServer;
    import com.sun.net.httpserver.spi.HttpServerProvider;
    import org.apache.commons.codec.binary.Base64;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.InetSocketAddress;
    import java.net.URI;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class HlsDecryptServerNoToken {
        private static DefaultAcsClient client;
        static {
            // Wilayah KMS, yang harus sama dengan wilayah video.
            String region = "cn-beijing";
            // Pasangan AccessKey untuk mengakses KMS.
            // Pasangan AccessKey akun Alibaba Cloud memiliki izin untuk semua operasi API. Kami menyarankan Anda menggunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin.
            // Kami sangat menyarankan agar Anda tidak menyematkan ID AccessKey dan Rahasia AccessKey secara langsung dalam kode proyek Anda. Melakukannya dapat menyebabkan kebocoran pasangan AccessKey dan mengompromikan keamanan semua sumber daya di akun Anda.
            // Contoh ini menunjukkan cara mengautentikasi permintaan API dengan membaca pasangan AccessKey dari variabel lingkungan. Sebelum menjalankan kode contoh, konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET.
            String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            client = new DefaultAcsClient(DefaultProfile.getProfile(region, accessKeyId, accessKeySecret));
        }
        /**
         * Deskripsi:
         * 1. Menerima permintaan dekripsi untuk mendapatkan ciphertext.
         * 2. Memanggil operasi dekripsi KMS untuk mendapatkan kunci plaintext.
         * 3. Mengembalikan kunci plaintext hasil decoding Base64.
         */
        public class HlsDecryptHandler implements HttpHandler {
            /**
             * Menangani permintaan dekripsi.
             * @param httpExchange
             * @throws IOException
             */
            public void handle(HttpExchange httpExchange) throws IOException {
                String requestMethod = httpExchange.getRequestMethod();
                if ("GET".equalsIgnoreCase(requestMethod)) {
                    // Dapatkan ciphertext dari URL.
                    String ciphertext = getCiphertext(httpExchange);
                    System.out.println(ciphertext);
                    if (null == ciphertext)
                        return;
                    // Dekripsi kunci dari KMS dan lakukan decoding Base64.
                    byte[] key = decrypt(ciphertext);
                    // Atur header.
                    setHeader(httpExchange, key);
                    // Kembalikan kunci hasil decoding Base64.
                    OutputStream responseBody = httpExchange.getResponseBody();
                    responseBody.write(key);
                    responseBody.close();
                }
            }
            private void setHeader(HttpExchange httpExchange, byte[] key) throws IOException {
                Headers responseHeaders = httpExchange.getResponseHeaders();
                responseHeaders.set("Access-Control-Allow-Origin", "*");
                httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, key.length);
            }
            /**
             * Memanggil operasi dekripsi KMS dan melakukan decoding Base64 pada plaintext.
             * @param ciphertext
             * @return
             */
            private byte[] decrypt(String ciphertext) {
                DecryptKMSDataKeyRequest request = new DecryptKMSDataKeyRequest();
                request.setCipherText(ciphertext);
                request.setProtocol(ProtocolType.HTTPS);
                try {
                    DecryptKMSDataKeyResponse response = client.getAcsResponse(request);
                    String plaintext = response.getPlaintext();
                    System.out.println("PlainText: " + plaintext);
                    // Catatan: Diperlukan decoding Base64.
                    return Base64.decodeBase64(plaintext);
                } catch (ClientException e) {
                    e.printStackTrace();
                    return null;
                }
            }
            /**
             * Mendapatkan parameter ciphertext dari URL.
             * @param httpExchange
             * @return
             */
            private String getCiphertext(HttpExchange httpExchange) {
                URI uri = httpExchange.getRequestURI();
                String queryString = uri.getQuery();
                String pattern = "CipherText=(\\w*)";
                Pattern r = Pattern.compile(pattern);
                Matcher m = r.matcher(queryString);
                if (m.find())
                    return m.group(1);
                else {
                    System.out.println("Parameter CipherText Tidak Ditemukan");
                    return null;
                }
            }
        }
        /**
         * Menjalankan layanan.
         *
         * @throws IOException
         */
        private void serviceBootStrap() throws IOException {
            HttpServerProvider provider = HttpServerProvider.provider();
            // Port pendengar dapat disesuaikan. Server dapat menerima hingga 30 permintaan konkuren.
            HttpServer httpserver = provider.createHttpServer(new InetSocketAddress(8099), 30);
            httpserver.createContext("/", new HlsDecryptHandler());
            httpserver.start();
            System.out.println("server dekripsi hls dimulai");
        }
        public static void main(String[] args) throws IOException {
            HlsDecryptServerNoToken server = new HlsDecryptServerNoToken();
            server.serviceBootStrap();
        }}
    
  2. Dapatkan URL pemutaran video atau kredensial.

    Panggil operasi GetVideoPlayAuth untuk mendapatkan kredensial pemutaran, atau panggil operasi GetPlayInfo untuk mendapatkan URL pemutaran.

  3. Mainkan video terenkripsi.

    Enkripsi standar HLS kompatibel dengan semua pemutar HLS. Anda dapat menggunakan pemutar buatan sendiri atau Pemutar Video Apsara untuk memutar video terenkripsi.

    Jika Anda menggunakan Pemutar Video Apsara, dapatkan token dan informasi autentikasi yang diperlukan untuk memutar video. Untuk informasi selengkapnya, lihat Putar video terenkripsi. Jika Anda menggunakan pemutar lain, implementasikan logika pemutaran.

    Bagian berikut menjelaskan proses pemutaran internal Pemutar Video Apsara:

    Tanpa penulisan ulang M3U8

    Alur kerja

    • Pemutar mengurai tag EXT-X-KEY dalam file M3U8 untuk mendapatkan URI kunci dekripsi, yang sesuai dengan nilai parameter DecryptKeyUri di EncryptConfig.

    • Pemutar secara otomatis meminta titik akhir dekripsi untuk mendapatkan kunci, mendekripsi file TS, lalu memutar video.

    Contoh

    • URL pemutaran: https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8

    • URL permintaan akhir: https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8

    • URL dekripsi: https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk7MTMtOT****

    • URL permintaan dekripsi akhir: https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****

Dokumentasi terkait