# วิธีการประมวลผลและเผยแพร่วิดีโอที่เข้ารหัสแบบ Clear Key
ระบบ ByteArk Stream รองรับการประมวลผลวิดีโอที่เข้ารหัสแบบ Clear Key ด้วยอัลกอริทึม AES-128 สำหรับวิดีโอในรูปแบบ HLS ผู้ชมวิดีโอที่ถูกเข้ารหัสจะไม่สามารถรับชมได้หากไม่ได้รับกุญแจ (Key) ที่ใช้ในการเข้ารหัส เพื่อใช้ในการถอดรหัสเสียก่อน ถึงแม้ว่าผู้ชมจะดาวน์โหลดวิดีโอดังกล่าวมาด้วยวิธีใดๆ ก็ตาม
# วิธีการเปิดใช้งานการเข้ารหัสแบบ Clearkey
- เข้าไปที่หน้าตั้งค่าโปรเจกต์ที่ต้องการ แล้วเลือกหัวข้อ การเข้ารหัสวิดีโอ
- เลือก “วิธีการเข้ารหัสวิดีโอ” เป็น “เข้ารหัสด้วยรูปแบบ AES-128 โดยส่งกุญแจด้วยแบบ Clearkey” จากนั้นระบุ URL ของ API ที่คุณพัฒนาขึ้น ทั้งนี้คุณสามารถทดสอบความถูกต้องของ API ได้จากเครื่องมือช่วยทดสอบที่อยู่ด้านล่างของหน้า (ไม่จำเป็นต้องบันทึกการตั้งค่า)
- คลิกที่ปุ่ม “บันทึก” เพื่อให้การเปลี่ยนแปลงมีผลกับวิดีโอที่จะอัปโหลดต่อไป
# กระบวนการทำงานโดยรวม
เพื่อให้คุณสามารถควบคุมวิธีการตรวจสอบสิทธิ์ของผู้ชม (เพื่อให้หรือไม่ให้กุญแจถอดรหัส) ได้อย่างเต็มที่ ระบบ ByteArk Qoder จึงเปิดให้คุณพัฒนา Key Server API เพื่อสร้างกุญแจเพื่อเข้ารหัส และควมคุมกระบวนการเผยแพร่กุญแจถอดรหัสได้ด้วยตัวคุณเอง
API ที่คุณพัฒนาจะเข้ามามีส่วนในการทำงานของระบบดังนี้
- ผู้ใช้อัปโหลดวิดีโอเข้าสู่โปรเจกต์ที่ถูกตั้งค่าไว้ว่าให้เข้ารหัสวิดีโอด้วยอัลกอริทึมแบบ AES-128
- ระบบประมวลผลวิดีโอของ ByteArk จะร้องขอกุญแจสำหรับเข้ารหัสผ่านทาง “Encoding encryption key request API (API สำหรับขอกุญแจสำหรับเข้ารหัส)” ที่คุณพัฒนาขึ้น (พร้อมกับ content_id, tech, definition) เพื่อนำไปใช้เข้ารหัสวิดีโอ
- “API สำหรับขอกุญแจสำหรับเข้ารหัส” ที่คุณพัฒนาขึ้น สร้างกุญแจสำหรับเข้ารหัสเก็บไว้พร้อมข้อมูล content_id, tech, definition ก่อนจะตอบกลับไป
- ระบบประมวลผลวิดีโอของ ByteArk ประมวลผลวิดีโอ โดยเข้ารหัสด้วยกุญแจที่ได้มา และบันทึก URL ของ “API สำหรับขอกุญแจสำหรับถอดรหัส” ไว้ในวิดีโอนั้นด้วย ส่วนกุญแจเข้ารหัสจะถูกลบทิ้งทันทีที่ประมวลผลเสร็จสิ้น
- วิดีโอถูกนำไปแสดงผลบนระบบของคุณ ด้วยวิธีการตามปกติ
- เมื่อผู้ชมรับชม Video Player จะโหลดวิดีโอ ก่อนจะพบว่าวิดีโอนั้นถูกเข้ารหัส และขอกุญแจสำหรับถอดรหัส ตาม URL ของ “Playback encryption key request API (API สำหรับขอกุญแจสำหรับถอดรหัส)” ที่ระบุไว้ในวิดีโอนั้น
- “API สำหรับขอกุญแจสำหรับถอดรหัส” ที่คุณพัฒนาขึ้น ค้นหากุญแจสำหรับถอดรหัส ซึ่งได้เก็บไว้พร้อมข้อมูล content_id, tech, definition ในขั้นตอนที่ 3 และตอบกลับไป (หรือไม่ตอบกลับไปหากคุณไม่ต้องการให้ผู้ชมดังกล่าวรับชมได้)
- Video Player นำกุญแจไปถอดรหัสระหว่างการเล่นเพื่อแสดงผลให้ผู้ชม
# รูปแบบของ Encoding encryption key request API (API สำหรับขอกุญแจสำหรับเข้ารหัส)
ByteArk Qoder จะเรียก API นี้ด้วยเมธอด POST ทุกครั้งที่มีการประมวลผลวิดีโอที่จะต้องเข้ารหัส พร้อมกับส่งค่าต่างๆ ต่อไปนี้
Name | ช่องทาง | Description |
---|---|---|
token | Query String | Encryption Key Request Token (รายละเอียดจะอธิบายต่อไป) |
X-ByteArk-Qoder-Secret | HTTP Request Header | Secret ลับจาก ByteArk Qoder เพื่อยืนยันว่าเป็นการเรียกจากโปรเจกต์ที่คุณต้องการจริง (ดูค่าได้จากหน้าตั้งค่าโปรเจกต์) |
สำหรับ Encryption Key Request Token นั้น จะอยู่ในรูปแบบ JWT Token (opens new window) ที่สร้างขึ้นด้วยวิธีเข้ารหัสแบบ HS256 โดยมีค่าภายใน token ดังต่อไปนี้
Name | Type | Required | Description |
---|---|---|---|
content_id | String | Yes | Video Key ของวิดีโอที่จะถูกเข้ารหัส |
tech | String | Yes | รูปแบบของวิดีโอที่จะถูกเข้ารหัส ในที่นี้จะมีค่าเป็น hls เสมอ |
definition | String | Yes | ความละเอียดของวิดีโอที่จะถูกเข้ารหัส เช่น 480p |
หากตรวจสอบแล้วว่า X-ByteArk-Qoder-Secret มีค่าถูกต้องตรงกัน API นี้จะต้องตอบกลับมาเป็นกุญแจสำหรับเข้ารหัส ซึ่งเป็น Binary ความยาว 16 Bytes โดยคุณจะต้องเก็บกุญแจนี้ไว้คู่กับข้อมูล content_id, tech, และ definition เพื่อใช้ใน API ถัดไป
คุณสามารถตรวจสอบความถูกต้องของ API นี้ได้จากหน้าปรับตั้งค่าของโปรเจกต์
# รูปแบบของ Playback encryption key request API (API สำหรับขอกุญแจสำหรับถอดรหัส)
ByteArk Player หรือ Video Player ของคุณ (ซึ่งต้องรองรับการเล่นวิดีโอแบบ HLS ที่เข้ารหัสด้วยอัลกอริทีม AES-128) จะร้องขอกุญแจสำหรับถอดรหัสผ่าน API นี้ ด้วยเมธอด GET ทุกครั้งที่มีการเล่นวิดีโอ โดยจะส่งพารามิเตอร์ผ่าน Query String ดังนี้
Name | ช่องทาง | Description | Description |
---|---|---|---|
token | Query String | Encryption Key Request Token เหมือนกันกับ API แรก | Video Key ของวิดีโอที่จะถูกเข้ารหัส |
API นี้จะต้องตอบกลับมาเป็นกุญแจสำหรับเข้ารหัส ซึ่งเป็น Binary ความยาว 16 Bytes เช่นเดียวกัน โดยให้ตอบกลับเป็นกุญแจสำหรับคอนเทนต์ที่มี content_id, tech, และ definition ตรงกับที่ตอบใน API แรก
ทั้งนี้ API สามารถเลือกที่จะไม่ตอบกุญแจ และส่ง response ที่มี status code เป็น 403 แทน หากคุณไม่ต้องการให้ผู้ชมคุณนั้นเล่นวิดีโอได้ โดยคุณอาจเลือกที่จะตรวจสอบผู้ชมได้จากกลยุทธ์ต่างๆ ตัวอย่างเช่น
- ในกรณีเป็นการรับชมผ่านเว็บไซต์ ที่ผู้ใช้ต้องเข้าสู่ระบบก่อนการรับชม
- กำหนดให้ URL ของ “API สำหรับขอกุญแจสำหรับถอดรหัส” เป็นโดเมนเดียวกัน หรือเป็น subdomain ภายใต้เว็บไซต์ของคุณ ซึ่งจะทำให้ API ดังกล่าวเข้าถึง cookie (และอาจรวมถึง session) ของเว็บไซต์ของคุณได้
- พัฒนา “API สำหรับขอกุญแจสำหรับถอดรหัส” ให้ตรวจสอบสิทธิ์ของผู้ชมคุณนั้นว่ามีสิทธิ์รับชมวิดีโอนั้นหรือไม่ ผ่าน cookie หรือ session ที่สามารถอ่านได้
- ในกรณีเป็นการรับชมผ่านเว็บไซต์ ที่ผู้ใช้ไม่ต้องเข้าสู่ระบบก่อนการรับชม
- กำหนดให้ URL ของ “API สำหรับขอกุญแจสำหรับถอดรหัส” เป็นโดเมนเดียวกัน หรือเป็น subdomain ภายใต้เว็บไซต์ของคุณ ซึ่งจะทำให้ API ดังกล่าวเข้าถึง cookie ของเว็บไซต์ของคุณได้
- พัฒนาหน้าเว็บที่มี Video Player อยู่ ให้เซท cookie ตามแพทเทิร์นที่คุณต้องการพร้อมกับการแสดงผลหน้าเว็บนั้น
- พัฒนา “API สำหรับขอกุญแจสำหรับถอดรหัส” ให้ตรวจสอบ cookie ที่ถูกเซทในขั้นตอนก่อนหน้านั้นว่าเป็นไปตามแพทเทิร์นที่คุณได้ออกแบบไว้หรือไม่
- ในกรณีเป็นการรับชมผ่านแอพลิเคชัน ที่ผู้ใช้ไม่ต้องเข้าสู่ระบบก่อนการรับชม
- ใช้ HTTPS Pin Certificate
# ข้อจำกัดและข้อพึงระวังในการใช้งาน
- คุณสามารถกำหนด URL ทั้งสองที่ต้องการได้เอง อย่างไรก็ตาม เมื่อระบบประมวลผลวิดีโอแล้ว จะทำการฝัง URL ของ API สำหรับขอกุญแจสำหรับถอดรหัสไว้ด้วย และไม่สามารถเปลี่ยนแปลงได้ในภายหลังโดยง่าย ดังนั้นกรุณาเลือก URL ของ API ที่คุณสามารถดูแลให้คงอยู่ได้ตลอดเวลาที่คุณให้บริการกับผู้ชม
- คุณจำเป็นต้องใช้ HTTPS เท่านั้น สำหรับ URL ของ API ทั้งสองนี้
- เพื่อความปลอดภัย ระบบจะใช้กุญแจเพื่อเข้ารหัสและลบทิ้งทันที โดยไม่มีการเก็บไว้ในระบบใดๆ ดังนั้นกรุณาเก็บกุญแจทั้งหมดที่สร้างไว้ไว้ให้ดี มิฉะนั้นวิดีโอจะไม่สามารถเล่นได้และไม่มีวิธีการใดๆ ที่จะกู้คืนกลับมาได้ทั้งสิ้น
- เพื่อความปลอดภัย ระบบจะใช้กุญแจเพื่อเข้ารหัสและลบทิ้งทันที ดังนั้นวิดีโออาจจะไม่สามารถเล่นได้แม้แต่ในหน้า console ของ ByteArk ก็ตาม (ขึ้นอยู่กับว่า API ที่คุณพัฒนาได้ให้กุญแจมาหรือไม่)