全部产品
Search
文档中心

ApsaraVideo VOD:Enkripsi HLS

更新时间:Jul 06, 2025

Enkripsi HLS menggunakan AES-128 untuk mengamankan video. Metode ini kompatibel dengan semua pemain HLS dan memerlukan manajemen kunci serta layanan token untuk kontrol akses. Enkripsi HLS sering digunakan di platform pendidikan online dan layanan streaming konten eksklusif yang membutuhkan keamanan tinggi. Topik ini menjelaskan cara mengimplementasikan enkripsi HLS untuk pengiriman video dan dekripsi untuk pemutaran.

Prinsip Kerja

ApsaraVideo VOD menggunakan teknologi enkripsi amplop, di mana penyedia layanan menghasilkan kunci data (DK) dan kunci data terbungkus (EDK) melalui Alibaba Cloud Key Management Service (KMS). DK mengenkripsi konten video, sedangkan EDK disimpan bersama dengan video yang telah dienkripsi. Selama pemutaran, layanan dekripsi mengambil DK untuk mendekripsi video.

Untuk memvalidasi URL dekripsi, Anda dapat mengaktifkan Enkripsi M3U8 dan Penulisan Ulang. Secara default, MtsHlsUriToken ditulis ulang, menambahkan lapisan enkripsi tambahan pada akses data HLS.

Prasyarat

  • Akun Alibaba Cloud Anda memiliki saldo yang cukup. Meskipun enkripsi HLS gratis, biaya transkoding diperlukan karena enkripsi memerlukan proses transcoding. Untuk detail harga, lihat Transkoding Media.

  • ApsaraVideo VOD harus diaktifkan. Untuk informasi lebih lanjut, lihat Aktivasi ApsaraVideo VOD.

  • ApsaraVideo VOD harus diberi otorisasi untuk mengakses KMS. Otorisasi dapat dilakukan di halaman Otorisasi Akses Sumber Daya Cloud.

  • Domain yang dipercepat harus ditambahkan ke ApsaraVideo VOD. Untuk informasi lebih lanjut, lihat Tambahkan nama domain untuk CDN.

  • SDK ApsaraVideo VOD harus diintegrasikan. Dalam topik ini, SDK ApsaraVideo VOD untuk Java digunakan sebagai contoh.

Konsep

Konsep

Deskripsi

RAM

Manajemen Akses Sumber Daya (RAM) adalah layanan dari Alibaba Cloud yang membantu Anda mengelola identitas pengguna dan mengontrol akses ke sumber daya. Untuk informasi lebih lanjut, lihat Apa itu RAM?

KMS

KMS adalah platform komprehensif untuk manajemen kunci, enkripsi data, dan manajemen rahasia. Ini menawarkan solusi yang sederhana, andal, dan aman yang memastikan data dienkripsi, dilindungi, dan sesuai dengan standar industri. Untuk informasi lebih lanjut, lihat Apa itu KMS?

DK

DK adalah kunci teks biasa yang digunakan untuk mengenkripsi data. Untuk informasi lebih lanjut, lihat Istilah.

EDK

EDK adalah kunci data ciphertext yang dibuat menggunakan enkripsi amplop. Untuk informasi lebih lanjut, lihat Istilah.

Proses Enkripsi dan Dekripsi

Unggah dan Enkripsi

视频安全-HLS标准加密3

Dekripsi dan Pemutaran

(Direkomendasikan) Enkripsi M3U8 dan Penulisan Ulang Diaktifkan

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

Enkripsi M3U8 dan Penulisan Ulang Dinonaktifkan

视频安全-HLS标准加密2

Enkripsi Video

  1. Unggah video Anda dan terima callback.

    Untuk memastikan bahwa video yang mendukung enkripsi HLS tidak secara otomatis ditranscoding, gunakan template grup No Transcoding bawaan sistem saat mengunggahnya ke ApsaraVideo VOD. Ini mencegah proses transcoding otomatis dipicu selama unggah.

    1. Unggah video menggunakan Konsol ApsaraVideo VOD atau API.

    2. Konfigurasikan notifikasi acara. Saat Anda menerima pesan callback FileUploadComplete, itu berarti video telah berhasil diunggah ke ApsaraVideo VOD.

  2. Siapkan layanan manajemen kunci.

    1. Buat kunci layanan.

      Kunci layanan adalah kunci utama di KMS yang digunakan untuk menghasilkan kunci enkripsi HLS. Kegagalan membuat kunci layanan akan menyebabkan kesalahan saat memanggil operasi GenerateKMSDataKey.

      1. Di pojok kiri atas halaman, pilih wilayah tempat Anda ingin membuat kunci layanan.

        Catatan

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

        标准加密-服务地域

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

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

        Setelah kunci layanan dibuat, sistem akan memberi tahu The service key is created. Anda dapat melihat kunci layanan di bagian Key Information.

        Catatan

        Jika Anda telah diberitahu bahwa kunci layanan telah berhasil dibuat tetapi masih tidak dapat melihat kunci tersebut, mungkin karena peran terhubung layanan hilang. Anda dapat memberi otorisasi ulang untuk memulihkan peran tersebut dan kemudian segarkan halaman untuk melihat kunci layanan.

    2. Hasilkan DK.

      Untuk menghasilkan DK dan EDK, panggil operasi GenerateKMSDataKey tanpa parameter input apa pun. Setelah berhasil, CiphertextBlob dalam respons menyediakan EDK yang diformat AES_128 untuk enkripsi HLS dan transcoding, sedangkan Plaintext dalam respons berisi DK.

  3. Buat grup template transcoding untuk enkripsi HLS.

    Selama proses enkripsi HLS, Anda memerlukan dua grup template transcoding: grup template No Transcoding bawaan dan grup template transcoding kustom. Berikut cara membuat grup template transcoding kustom untuk enkripsi HLS:

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

    2. Di halaman Grup Template Transcoding, klik Buat Grup Template Transcoding.

      Di bagian Parameter Dasar, atur Encapsulation Format ke hls. Di bagian Advanced Parameters, aktifkan Video Encryption dan atur Encryption Method ke Kriptografi Proprietary Alibaba Cloud. Untuk parameter lainnya, konfigurasikan sesuai kebutuhan aktual Anda. Untuk deskripsi parameter, lihat Template Transcoding.视频安全-HLS加密-控制台

    3. Setelah membuat grup template transcoding, temukan ID-nya di halaman Grup Template Transcoding. Simpan ID ini, karena Anda akan memerlukannya nanti untuk enkripsi dan transcoding HLS.视频安全-HLS加密-控制台1

  4. Inisiasi permintaan enkripsi dan transcoding HLS.

    1. Panggil operasi SubmitTranscodeJobs untuk memulai enkripsi dan transcoding HLS.

      Kode sampel dalam Java

      Tabel berikut menjelaskan parameter dalam kode sampel. Anda dapat memodifikasinya berdasarkan kebutuhan bisnis Anda.

      Parameter

      Deskripsi

      request.setTemplateGroupId("")

      ID grup template transcoding yang dibuat di Langkah 3.

      request.setVideoId("")

      ID video yang diunggah di Langkah 1.

      encryptConfig.put("CipherText","")

      Nilai CiphertextBlob yang dikembalikan di Langkah 2.

      encryptConfig.put("DecryptKeyUri","")

      URI kunci. URI terdiri dari alamat IP layanan dekripsi dan nilai CiphertextBlob. Jika port lokal 8099 digunakan, URI kunci adalah http://172.16.0.1:8099?CipherText=Nilai CiphertextBlob

      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 dari akun Alibaba Cloud memiliki izin untuk memanggil semua operasi API. Kami merekomendasikan Anda menggunakan pasangan AccessKey dari pengguna RAM untuk memanggil operasi API atau melakukan pemeliharaan rutin.
          // Kami merekomendasikan Anda untuk tidak mengkode keras pasangan AccessKey (AccessKey ID dan AccessKey secret) di kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya dalam akun Anda mungkin terganggu.
          // Dalam contoh ini, ApsaraVideo VOD membaca pasangan AccessKey dari variabel lingkungan untuk mengimplementasikan verifikasi identitas untuk akses API. Sebelum Anda menjalankan kode sampel, konfigurasikan variabel lingkungan berikut: 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";  // Tentukan wilayah tempat ApsaraVideo VOD diaktifkan.
              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 acara di ApsaraVideo VOD, transcoding video selesai ketika Anda menerima callback StreamTranscodeComplete atau TranscodeComplete.

  5. Lihat hasil enkripsi HLS.

    Setelah transcoding selesai, Anda dapat menentukan apakah enkripsi HLS berhasil dengan menggunakan metode berikut:

    • Metode 1: Masuk ke Konsol ApsaraVideo VOD. Di panel navigasi sebelah kiri, pilih Media Files > Audio/Video. Di halaman Video dan Audio, temukan video yang Anda unggah dan klik Kelola di kolom Tindakan. Di tab URL Video, jika keluaran video dalam format selain MP4 ada, dan HLS Encryption ditandai pada file M3U8, enkripsi HLS berhasil.视频安全-HLS标准加密5

    • Metode 2: Salin URL file M3U8 yang ditandai dengan HLS Encryption, jalankan perintah curl -v "URL file M3U8", dan periksa hasilnya. Jika URL dekripsi yang Anda tentukan saat memulai enkripsi HLS sama dengan nilai DecryptKeyUri, enkripsi HLS berhasil.

    • Metode 3: Panggil operasi GetTranscodeTask dan lewatkan nilai parameter JobId yang dikembalikan di Langkah 4. Jika nilai TranscodeTemplateId dalam respons cocok dengan ID grup template transcoding yang dibuat di Langkah 3 dan TranscodeJobStatus menunjukkan "Transcoding berhasil," enkripsi HLS berhasil.

(Direkomendasikan) Enkripsi M3U8 dan Penulisan Ulang

Setelah mengaktifkan fitur enkripsi M3U8 dan penulisan ulang, sistem akan secara otomatis menambahkan parameter enkripsi (seperti algoritma enkripsi, URI kunci, dan parameter autentikasi) setelah tag #EXT-X-KEY di file playlist M3U8. Saat klien memproses file playlist M3U8 yang ditulis ulang, ia menggunakan URI kunci (yang mencakup parameter autentikasi) untuk meminta kunci dekripsi. Klien kemudian mendekripsi file transport stream (TS) menggunakan kunci ini dan algoritma yang ditentukan, memastikan akses terenkripsi ke aliran HLS.

Langkah 1: Aktifkan pass-through parameter untuk enkripsi HLS

Masuk ke konsol ApsaraVideo VOD dan aktifkan Parameter Pass-through for HLS Encryption.

Setelah mengaktifkan Parameter Pass-through for HLS Encryption, file playlist M3U8 dapat dimodifikasi. Secara spesifik, ini melibatkan modifikasi URI di tag #EXT-X-KEY dengan menambahkan parameter yang dibawa dalam permintaan klien di akhir. Secara default, MtsHlsUriToken ditulis ulang.

Prasyarat

Berbagi Sumber Daya Lintas Asal (CORS) harus dikonfigurasi.

Penting

Alibaba Cloud Gov Cloud tidak mendukung pass-through parameter untuk enkripsi HLS.

Prosedur

  1. Masuk ke Konsol ApsaraVideo VOD.

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

  3. Pilih CDN Configuration > Domain Names. Halaman Domain Names akan ditampilkan.

  4. Cari nama domain yang ingin dikonfigurasi, lalu klik Configure pada kolom Actions.

  5. Di panel navigasi sebelah kiri nama domain, klik Video Related.

  6. Di bagian Pemutaran Terenkripsi, aktifkan Parameter Pass-through for HLS Encryption.p181836

Catatan
  • Setelah Anda mengaktifkan fitur ini, sistem akan secara otomatis menangani autentikasi dengan menulis ulang parameter Token saat Anda melewati parameter enkripsi HLS. Parameter yang ditulis ulang adalah MtsHlsUriToken, dan nilainya adalah test. Selama dekripsi dan pemutaran CDN, MtsHlsUriToken=test akan ditambahkan di akhir URI di tag #EXT-X-KEY file playlist M3U8.

Langkah 2: Kirim permintaan yang mencakup parameter MtsHlsUriToken

Kirim permintaan ke point of presence (POP) untuk mengakses file playlist M3U8 dan sertakan MtsHlsUriToken dalam permintaan.

Untuk mendapatkan MtsHlsUriToken, Anda harus menyiapkan layanan token.

Kode sampel berikut menunjukkan cara mendapatkan MtsHlsUriToken. Tabel berikut menjelaskan parameter dalam kode sampel. Anda dapat memodifikasinya berdasarkan kebutuhan bisnis Anda.

Kode sampel dalam Java

Parameter

Deskripsi

ENCRYPT_KEY

Kunci enkripsi. Anda dapat menentukan string kustom yang panjangnya 16, 24, atau 32 karakter.

INIT_VECTOR

Offset enkripsi. Anda dapat menentukan string kustom yang panjangnya 16 karakter. Nilai tersebut 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 berikut tidak diperlukan jika Anda tidak menggunakan algoritma AES untuk menghasilkan token.
    private static String ENCRYPT_KEY = ""; // Kunci enkripsi kustom. String tersebut harus memiliki panjang 16, 24, atau 32 karakter.
    private static String INIT_VECTOR = ""; // Offset enkripsi kustom. String tersebut harus memiliki panjang 16 karakter dan tidak boleh mengandung karakter khusus.

    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 token.
    }
    /**
     * Hasilkan token berdasarkan parameter yang dikonfigurasi.
     * Catatan:
     * 1. Parameter termasuk ID pengguna dan jenis perangkat pemutaran.
     * 2. Token dihasilkan saat operasi token dipanggil.
     * @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), "_");
        // Tetapkan masa berlaku token menjadi 30 detik. Anda dapat mengubah nilai tersebut berdasarkan kebutuhan bisnis Anda.
        long expire = System.currentTimeMillis() + 30000L;
        base += "_" + expire;   // String kustom yang panjangnya 16 karakter. Dalam contoh ini, 2 karakter lagi diperlukan karena timestamp berisi 13 karakter dan garis bawah (_) adalah 1 karakter. Anda dapat mengubah nilai parameter base. Nilainya harus 16, 24, atau 32 karakter.
        // Hasilkan token.
        String token = encrypt(base, ENCRYPT_KEY);  // arg1 adalah string kustom yang akan dienkripsi. arg2 adalah kunci enkripsi.
        // Simpan token. Validitas token diperiksa selama dekripsi, seperti periode validitas dan jumlah penggunaan token.
        saveToken(token);
        return token;
    }

    /**
     * Periksa apakah token valid.
     * Catatan:
     * 1. Sebelum operasi dekripsi mengembalikan kunci pemutaran, layanan dekripsi memeriksa apakah token sah dan valid.
     * 2. Kami merekomendasikan Anda memeriksa periode validitas token dan jumlah penggunaan token.
     * @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); // arg1 adalah string yang akan didekripsi. arg2 adalah kunci dekripsi.
        // Periksa periode validitas token.
        Long expireTime = Long.valueOf(base.substring(base.lastIndexOf("_") + 1));
        System.out.println("Periksa periode validitas:" + expireTime);
        if (System.currentTimeMillis() > expireTime) {
            return false;
        }
        // Dapatkan informasi token dari database dan periksa apakah token valid. Anda dapat menyesuaikan logika.
        TokenInfo dbToken = getToken(token);
        // Periksa apakah token telah digunakan.
        if (dbToken == null || dbToken.useCount > 0) {
            return false;
        }
        // Dapatkan atribut bisnis untuk verifikasi.
        String businessInfo = base.substring(0, base.lastIndexOf("_"));
        String[] items = businessInfo.split("_");
        // Periksa validitas atribut bisnis. Anda dapat menyesuaikan logika.
        return validateInfo(items);
    }
    /**
     * Simpan token ke database.
     * Anda dapat menyesuaikan logika.
     *
     * @param token
     */
    public void saveToken(String token) {
        // TODO. Simpan token.
    }
    /**
     * Kueri token.
     * Anda dapat menyesuaikan logika.
     *
     * @param token
     */
    public TokenInfo getToken(String token) {
        // TODO. Dapatkan token dari database dan periksa apakah token valid.
        return null;
    }
    /**
     * Periksa validitas atribut bisnis. Anda dapat menyesuaikan logika.
     *
     * @param infos
     * @return
     */
    public boolean validateInfo(String... infos) {
        // TODO. Periksa validitas informasi, seperti UID.
        return true;
    }
    /**
     * Hasilkan token menggunakan algoritma 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);
    }
    /**
     * Dekripsi token menggunakan algoritma 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);
    }
    /**
     * Dapatkan informasi token. Kode sampel hanya untuk referensi. Anda dapat mendapatkan informasi token tambahan berdasarkan skenario bisnis Anda.
     */
    class TokenInfo {
        // Dapatkan jumlah penggunaan token. Modifikasi harus disinkronkan di lingkungan terdistribusi.
        int useCount;
        // Isi token.
        String token;
    }}
                        

Langkah 3: Dekripsi file pemutaran

Setelah menerima permintaan klien, POP akan mendekripsi file pemutaran setelah autentikasi berhasil.

Jika nilai MtsHlsUriToken yang dihasilkan di Langkah 2 adalah test, Alibaba Cloud CDN akan menambahkan MtsHlsUriToken=test di akhir URI di tag #EXT-X-KEY file playlist M3U8 selama dekripsi dan pemutaran.

Anda perlu mengimplementasikan logika validasi autentikasi sendiri. Untuk referensi, Anda dapat meninjau kode sampel yang disediakan untuk menyiapkan layanan dekripsi dengan enkripsi M3U8 dan penulisan ulang diaktifkan di bagian Putar video.

Putar video

(Direkomendasikan) Enkripsi M3U8 dan Penulisan Ulang Diaktifkan

  1. Siapkan layanan dekripsi.

    Siapkan layanan HTTP lokal untuk mendekripsi video Anda.

    Panggil operasi DecryptKMSDataKey untuk mendekripsi DK. Nilai PlainText dalam respons berisi DK. DK ini adalah versi Base64-decoded dari parameter PlainText yang dikembalikan dalam respons ke operasi GenerateKMSDataKey.

    Jika Anda ingin memverifikasi URL dekripsi, aktifkan enkripsi M3U8 dan penulisan ulang. Secara default, MtsHlsUriToken ditulis ulang. Dengan cara ini, data Anda dilindungi selama akses data HLS. Kode yang digunakan untuk menyiapkan layanan dekripsi bervariasi berdasarkan apakah fitur enkripsi M3U8 dan penulisan ulang diaktifkan atau tidak. Bagian berikut menjelaskan kode sampel:

    Kode sampel dalam Java

    Tabel berikut menjelaskan parameter dalam kode sampel. Anda dapat memodifikasinya berdasarkan kebutuhan bisnis Anda.

    Parameter

    Deskripsi

    region

    ID wilayah. KMS dan ApsaraVideo VOD harus diaktifkan di wilayah yang sama. Misalnya, jika Anda mengaktifkan KMS dan ApsaraVideo VOD di China (Shanghai), tentukan cn-shanghai untuk parameter ini. Untuk informasi lebih lanjut tentang ID wilayah lainnya, lihat ID Wilayah ApsaraVideo VOD.

    AccessKey

    ID AccessKey dan rahasia AccessKey akun Alibaba Cloud atau pengguna RAM Anda. Untuk informasi lebih lanjut tentang cara mendapatkan pasangan AccessKey, lihat Dapatkan pasangan AccessKey.

    httpserver

    Nomor port yang ingin Anda gunakan untuk mengaktifkan 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 tempat KMS digunakan. Wilayah tersebut harus sama dengan wilayah tempat video berada.
            String region = "";
            // Pasangan AccessKey yang digunakan untuk mengotorisasi akses ke KMS.
            // Pasangan AccessKey dari akun Alibaba Cloud memiliki izin untuk memanggil semua operasi API. Kami merekomendasikan Anda menggunakan pasangan AccessKey dari pengguna RAM untuk memanggil operasi API atau melakukan pemeliharaan rutin.
            // Kami merekomendasikan Anda untuk tidak mengkode keras pasangan AccessKey (AccessKey ID dan AccessKey secret) di kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya dalam akun Anda mungkin terganggu.
            // Dalam contoh ini, ApsaraVideo VOD membaca pasangan AccessKey dari variabel lingkungan untuk mengimplementasikan verifikasi identitas untuk akses API. Sebelum Anda menjalankan kode sampel, konfigurasikan variabel lingkungan berikut: 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));
        }
        /**
         * Catatan:
         * 1. Terima permintaan dekripsi dan dapatkan EDK dan token.
         * 2. Panggil operasi DecryptKMSDataKey dari KMS untuk mendapatkan DK.
         * 3. Dekode DK menggunakan algoritma Base64 dan kembalikan DK.
         */
        public class HlsDecryptHandler implements HttpHandler {
            /**
             * Proses permintaan dekripsi.
             * @param httpExchange
             * @throws IOException
             */
            public void handle(HttpExchange httpExchange) throws IOException {
                String requestMethod = httpExchange.getRequestMethod();
                if ("GET".equalsIgnoreCase(requestMethod)) {
                    // Periksa apakah token valid.
                    String token = getMtsHlsUriToken(httpExchange);
                    boolean validRe = validateToken(token);
                    if (!validRe) {
                        return;
                    }
                    // Dapatkan EDK dari URL video.
                    String ciphertext = getCiphertext(httpExchange);
                    if (null == ciphertext)
                        return;
                    // Dekode DK yang diperoleh dari KMS menggunakan algoritma Base64 dan kembalikan DK.
                    byte[] key = decrypt(ciphertext);
                    // Konfigurasikan header.
                    setHeader(httpExchange, key);
                    // Kembalikan DK yang didekode menggunakan algoritma 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);
            }
            /**
             * Panggil operasi dekripsi KMS untuk mendekripsi DK dan dekode DK menggunakan algoritma Base64.
             * @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: Anda harus mendekode DK menggunakan algoritma Base64.
                    return Base64.decodeBase64(plaintext);
                } catch (ClientException e) {
                    e.printStackTrace();
                    return null;
                }
            }
            /**
             * Dapatkan EDK dari URL video.
             * @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("Not Found CipherText Param");
                    return null;
                }
            }
            
              /**
             * Periksa validitas token, yang penting untuk enkripsi M3U8 dan penulisan ulang.
             * @param token
             * @return
             */
            private boolean validateToken(String token) {
                if (null == token || "".equals(token)) {
                    return false;
                }
                // TODO. Anda dapat menyesuaikan logika untuk memeriksa apakah token valid.
                return true;
            }
            /**
             * Dapatkan parameter Token, yang penting untuk enkripsi M3U8 dan penulisan ulang.
             *
             * @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("Not Found MtsHlsUriToken Param");
                    return null;
                }
            }
        }
        /**
         * Mulai layanan.
         *
         * @throws IOException
         */
        private void serviceBootStrap() throws IOException {
            HttpServerProvider provider = HttpServerProvider.provider();
            // Anda dapat menentukan port kustom untuk mendengarkan. Server web dapat menangani maksimal 30 permintaan secara bersamaan pada port yang sama.
            HttpServer httpserver = provider.createHttpServer(new InetSocketAddress(8099), 30);
            httpserver.createContext("/", new HlsDecryptHandler());
            httpserver.start();
            System.out.println("hls decrypt server started");
        }
        public static void main(String[] args) throws IOException {
            HlsDecryptServer server = new HlsDecryptServer();
            server.serviceBootStrap();
        }}
  2. Dapatkan URL pemutaran dan kredensial video terenkripsi Anda.

    Panggil operasi GetVideoPlayAuth untuk mendapatkan kredensial pemutaran dan panggil operasi GetPlayInfo untuk mendapatkan URL pemutaran.

  3. Putar video terenkripsi.

    Enkripsi HLS mendukung semua pemain yang kompatibel dengan HLS. Anda dapat menggunakan pemain yang dikembangkan sendiri atau ApsaraVideo Player untuk memutar video terenkripsi.

    Jika Anda menggunakan ApsaraVideo Player untuk memutar video terenkripsi, Anda harus mendapatkan token dan informasi autentikasi. Untuk informasi lebih lanjut, lihat Cara memutar video terenkripsi. Jika Anda menggunakan pemain pihak ketiga, implementasikan logika pemutaran sendiri.

    Prosedur berikut menjelaskan cara ApsaraVideo Player menguji pemutaran:

    (Direkomendasikan) Enkripsi M3U8 dan Penulisan Ulang Diaktifkan

    Proses

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

    • Untuk membatasi akses tidak sah, pemain harus menyertakan informasi autentikasi (diteruskan melalui parameter MtsHlsUriToken) saat meminta operasi dekripsi.

    • Pemain secara otomatis memanggil operasi DecryptKMSDataKey untuk mendapatkan DK, mendekripsi file TS yang terenkripsi, dan kemudian melanjutkan dengan pemutaran normal.

    Contoh

    • URL pemutaran video adalah https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8. Permintaan harus berisi parameter MtsHlsUriToken.

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

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

    • URL permintaan akhir untuk dekripsi adalah https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****&MtsHlsUriToken=<Token yang dikeluarkan>.

Enkripsi M3U8 dan Penulisan Ulang Dinonaktifkan

  1. Siapkan layanan dekripsi.

    Siapkan layanan HTTP lokal untuk mendekripsi video Anda.

    Panggil operasi DecryptKMSDataKey untuk mendekripsi DK. Nilai PlainText dalam respons berisi DK. DK ini adalah versi Base64-decoded dari parameter PlainText yang dikembalikan dalam respons ke operasi GenerateKMSDataKey.

    Kode sampel:

    Kode sampel dalam Java

    Tabel berikut menjelaskan parameter dalam kode sampel. Anda dapat memodifikasinya berdasarkan kebutuhan bisnis Anda.

    Parameter

    Deskripsi

    region

    ID wilayah. KMS dan ApsaraVideo VOD harus diaktifkan di wilayah yang sama. Misalnya, jika Anda mengaktifkan KMS dan ApsaraVideo VOD di China (Shanghai), tentukan cn-shanghai untuk parameter ini. Untuk informasi lebih lanjut tentang ID wilayah lainnya, lihat ID Wilayah ApsaraVideo VOD.

    AccessKey

    ID AccessKey dan rahasia AccessKey akun Alibaba Cloud atau pengguna RAM Anda. Untuk informasi lebih lanjut tentang cara mendapatkan pasangan AccessKey, lihat Dapatkan pasangan AccessKey.

    httpserver

    Nomor port yang ingin Anda gunakan untuk mengaktifkan 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 tempat KMS digunakan. Wilayah tersebut harus sama dengan wilayah tempat video berada.
            String region = "cn-beijing";
            // Pasangan AccessKey yang digunakan untuk mengotorisasi akses ke KMS.
            // Pasangan AccessKey dari akun Alibaba Cloud memiliki izin untuk memanggil semua operasi API. Kami merekomendasikan Anda menggunakan pasangan AccessKey dari pengguna RAM untuk memanggil operasi API atau melakukan pemeliharaan rutin.
            // Kami merekomendasikan Anda untuk tidak mengkode keras pasangan AccessKey (AccessKey ID dan AccessKey secret) di kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya dalam akun Anda mungkin terganggu.
            // Dalam contoh ini, ApsaraVideo VOD membaca pasangan AccessKey dari variabel lingkungan untuk mengimplementasikan verifikasi identitas untuk akses API. Sebelum Anda menjalankan kode sampel, konfigurasikan variabel lingkungan berikut: 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));
        }
        /**
         * Catatan:
         * 1. Terima permintaan dekripsi dan dapatkan EDK dan token.
         * 2. Panggil operasi DecryptKMSDataKey dari KMS untuk mendapatkan DK.
         * 3. Dekode DK menggunakan algoritma Base64.
         */
        public class HlsDecryptHandler implements HttpHandler {
            /**
             * Proses permintaan dekripsi.
             * @param httpExchange
             * @throws IOException
             */
            public void handle(HttpExchange httpExchange) throws IOException {
                String requestMethod = httpExchange.getRequestMethod();
                if ("GET".equalsIgnoreCase(requestMethod)) {
    
                    // Dapatkan EDK dari URL video.
                    String ciphertext = getCiphertext(httpExchange);
                    System.out.println(ciphertext);
                    if (null == ciphertext)
                        return;
                    // Dekode DK yang diperoleh dari KMS menggunakan algoritma Base64 dan kembalikan DK.
                    byte[] key = decrypt(ciphertext);
                    // Konfigurasikan header.
                    setHeader(httpExchange, key);
                    // Kembalikan DK yang didekode menggunakan algoritma 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);
            }
            /**
             * Panggil operasi dekripsi KMS untuk mendekripsi DK dan dekode DK menggunakan algoritma Base64.
             * @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: Anda harus mendekode DK menggunakan algoritma Base64.
                    return Base64.decodeBase64(plaintext);
                } catch (ClientException e) {
                    e.printStackTrace();
                    return null;
                }
            }
    
            /**
             * Dapatkan EDK dari URL video.
             * @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("Not Found CipherText Param");
                    return null;
                }
            }
        }
    
        /**
         * Mulai layanan.
         *
         * @throws IOException
         */
        private void serviceBootStrap() throws IOException {
            HttpServerProvider provider = HttpServerProvider.provider();
            // Anda dapat menentukan port kustom untuk mendengarkan. Server web dapat menangani maksimal 30 permintaan secara bersamaan pada port yang sama.
            HttpServer httpserver = provider.createHttpServer(new InetSocketAddress(8099), 30);
            httpserver.createContext("/", new HlsDecryptHandler());
            httpserver.start();
            System.out.println("hls decrypt server started");
        }
        public static void main(String[] args) throws IOException {
            HlsDecryptServerNoToken server = new HlsDecryptServerNoToken();
            server.serviceBootStrap();
        }}
    
  2. Dapatkan URL pemutaran dan kredensial video terenkripsi Anda.

    Panggil operasi GetVideoPlayAuth untuk mendapatkan kredensial pemutaran dan panggil operasi GetPlayInfo untuk mendapatkan URL pemutaran.

  3. Putar video terenkripsi.

    Enkripsi HLS mendukung semua pemain yang kompatibel dengan HLS. Anda dapat menggunakan pemain yang dikembangkan sendiri atau ApsaraVideo Player untuk memutar video terenkripsi.

    Jika Anda menggunakan ApsaraVideo Player untuk memutar video terenkripsi, Anda harus mendapatkan token dan informasi autentikasi. Untuk informasi lebih lanjut, lihat Cara memutar video terenkripsi. Jika Anda menggunakan pemain pihak ketiga, implementasikan logika pemutaran sendiri.

    Prosedur berikut menjelaskan cara ApsaraVideo Player menguji pemutaran:

    Enkripsi M3U8 dan Penulisan Ulang Dinonaktifkan

    Proses

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

    • Pemain secara otomatis memanggil operasi DecryptKMSDataKey untuk mendapatkan DK, mendekripsi file TS yang terenkripsi, dan kemudian melanjutkan dengan pemutaran normal.

    Contoh

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

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

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

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

Referensi