DRM (Digital Rights Management) คือชุดเทคโนโลยีสำหรับปกป้องเนื้อหาดิจิทัลจากการคัดลอกและเผยแพร่โดยไม่ได้รับอนุญาต ในแอปพลิเคชันมือถือ DRM ใช้สำหรับเข้ารหัสวิดีโอ เสียง และหนังสืออิเล็กทรอนิกส์ เพื่อให้มั่นใจว่ามีการปฏิบัติตามข้อตกลงสิทธิ์การใช้งานระหว่างเจ้าของสิทธิ์และผู้บริโภค ตาม Google Widevine Documentation, 2026, DRM ถูกฝังอยู่ในบริการสตรีมมิงส่วนใหญ่ — Netflix, Spotify, Apple TV+ — และจำเป็นสำหรับการเผยแพร่เนื้อหาพรีเมียมอย่างถูกกฎหมาย
ประเด็นสำคัญ
DRM คือชุดของวิธีการเข้ารหัสและซอฟต์แวร์ที่ควบคุมการเข้าถึงเนื้อหาดิจิทัล ต่างจากการเข้ารหัสแบบธรรมดา DRM รวมถึงระบบสิทธิ์การใช้งาน: เนื้อหาถูกเข้ารหัส และการดูต้องใช้คีย์ที่จะออกให้หลังจากตรวจสอบสิทธิ์ของผู้ใช้แล้วเท่านั้น
วัตถุประสงค์หลักของ DRM คือการป้องกันการละเมิดลิขสิทธิ์และให้แน่ใจว่ามีการปฏิบัติตามข้อจำกัดในภูมิภาค หากไม่มี DRM เจ้าของเนื้อหา (สตูดิโอภาพยนตร์ ค่ายเพลง) จะไม่ให้สิทธิ์การใช้งานเนื้อหาของตนแก่แพลตฟอร์มสตรีมมิง ตาม Motion Picture Association (2025) การใช้ DRM ลดการเผยแพร่ภาพยนตร์ที่ผิดกฎหมายบนสตรีมมิงลง 62% เมื่อเทียบกับยุค DVD-rip
ในการพัฒนามือถือ DRM ถูกฝังที่ระดับโปรแกรมเล่นสื่อ: นักพัฒนาใช้ ExoPlayer (Android), AVPlayer (iOS) หรือ Shaka Player (Web) ซึ่งรองรับการถอดรหัสในตัวของสตรีมที่เข้ารหัส นักพัฒนาไม่จำเป็นต้อง implement การเข้ารหัส — เพียงรวม SDK สำหรับการให้สิทธิ์ใช้งาน
มาตรฐาน CENC (Common Encryption — ISO/IEC 23001-7) อนุญาตให้ใช้ไฟล์สื่อที่เข้ารหัสไฟล์เดียวสำหรับระบบ DRM ทั้งหมด เนื้อหาจะถูกเข้ารหัสครั้งเดียวและคีย์จะถูกกระจายผ่านเซิร์ฟเวอร์สิทธิ์การใช้งานที่แตกต่างกัน นี่เป็นสิ่งสำคัญสำหรับบริการหลายแพลตฟอร์ม: Netflix เข้ารหัสภาพยนตร์ครั้งเดียวและส่งไปยัง Android (Widevine), iOS (FairPlay) และ Windows (PlayReady) โดยไม่ต้องเข้ารหัสซ้ำ
CENC ใช้การเข้ารหัส CBC ด้วยคีย์ที่แตกต่างกันสำหรับแทร็กเสียงและวิดีโอ แต่ละคีย์จะถูกจัดเก็บในรูปแบบเข้ารหัสในไฟล์ประกาศ MPD (MPEG-DASH) หรือ M3U8 (HLS) ตัวระบุเนื้อหา (KID) เชื่อมโยงสตรีมที่เข้ารหัสกับสิทธิ์การใช้งานบนเซิร์ฟเวอร์ — หากไม่มีสิทธิ์การใช้งานที่ถูกต้อง คีย์จะไม่สามารถถอดรหัสได้
กระบวนการเล่น DRM ประกอบด้วยสี่ขั้นตอน: การโหลดไฟล์ประกาศ การได้รับสิทธิ์การใช้งาน การถอดรหัสเนื้อหา และการแสดงผล แต่ละขั้นตอนดำเนินการโดยส่วนประกอบต่าง ๆ ของระบบ — โปรแกรมเล่นสื่อ, โมดูล CDM และเซิร์ฟเวอร์สิทธิ์การใช้งาน
CDM คือโมดูลซอฟต์แวร์หรือฮาร์ดแวร์ที่ได้รับการป้องกันซึ่งทำการถอดรหัสเนื้อหา บน Android CDM ถูก implement ที่ระดับ MediaDrm API; บน iOS มันถูกฝังใน AVFoundation ผ่าน AVContentKeySession CDM ไม่เคยเปิดเผยคีย์ให้กับแอปพลิเคชัน — การดำเนินการเข้ารหัสทั้งหมดจะดำเนินการภายในสภาพแวดล้อมที่ปลอดภัย (TEE — Trusted Execution Environment)
บนอุปกรณ์ที่รองรับฮาร์ดแวร์ (Secure Level 1) CDM ทำงานภายใน TEE — คีย์ไม่เคยเข้าสู่หน่วยความจำหลักของอุปกรณ์ นี่คือข้อกำหนดของสตูดิโอสำหรับการเล่นเนื้อหา 4K HDR บนอุปกรณ์ที่ไม่มี TEE คีย์จะถูกถอดรหัสด้วยซอฟต์แวร์ (L3) ซึ่งลดความปลอดภัยและจำกัดคุณภาพสูงสุดที่ 540p
สามระบบ DRM ครองแพลตฟอร์มมือถือ แต่ละระบบเป็นเอกสิทธิ์สำหรับระบบนิเวศของตน แต่ทั้งหมดรองรับ CENC ซึ่งอนุญาตให้ใช้สตรีมเนื้อหาที่เข้ารหัสเดียวบนทุกแพลตฟอร์ม
| DRM | ผู้พัฒนา | แพลตฟอร์ม | คุณภาพสูงสุด | การป้องกันฮาร์ดแวร์ |
|---|---|---|---|---|
| Widevine | Android, Chrome, Android TV | 4K HDR (L1) | TEE (L1) | |
| FairPlay | Apple | iOS, iPadOS, macOS, tvOS | 4K HDR (iOS) | Secure Enclave |
| PlayReady | Microsoft | Windows, Xbox, Windows Phone | 4K (SL3000) | TPM + TEE |
สำหรับบริการสตรีมมิงที่ทำงานบนทุกแพลตฟอร์ม จำเป็นต้องรองรับทั้งสามระบบ DRM วิธีแก้ปัญหาที่ใช้งานได้จริงคือการใช้ CDN ที่รองรับ Multi-DRM (Muvi, Vualto, Axinom) ซึ่งจะกำหนดเส้นทางคำขอสิทธิ์การใช้งานไปยังเซิร์ฟเวอร์ที่เหมาะสมโดยอัตโนมัติตามอุปกรณ์ของผู้ใช้ ตาม Streaming Learning Center (2025) 78% ของบริการสตรีมมิงใช้แนวทาง Multi-DRM
มาตรฐาน MPEG-DASH กับ CENC ทำให้สถาปัตยกรรมง่ายขึ้น: เนื้อหาถูกเข้ารหัสครั้งเดียวด้วยคีย์ที่ใช้ร่วมกัน และระบบ DRM จะถูกเลือกที่ฝั่งไคลเอ็นต์ เซิร์ฟเวอร์สิทธิ์การใช้งานได้รับคำขอพร้อมตัวระบุอุปกรณ์และส่งคืนคีย์ที่เข้ารหัสสำหรับ CDM เฉพาะ ไม่มีความแตกต่างในเนื้อหาสำหรับแพลตฟอร์มต่าง ๆ — เพียงเซิร์ฟเวอร์สิทธิ์การใช้งานที่แตกต่างกัน
Widevine คือระบบ DRM ของ Google ซึ่งเป็นมาตรฐานโดยพฤตินัยบน Android รองรับสามระดับความปลอดภัยที่กำหนดว่าการถอดรหัสเนื้อหาจะเกิดขึ้นที่ไหนและอย่างไร ระดับความปลอดภัยขึ้นอยู่กับความสามารถของฮาร์ดแวร์ของอุปกรณ์และกำหนดความละเอียดสูงสุดของเนื้อหา
Widevine L1 (ฮาร์ดแวร์) — ระดับที่ปลอดภัยที่สุด การดำเนินการเข้ารหัสทั้งหมดจะดำเนินการภายใน Trusted Execution Environment (TEE) คีย์ไม่เคยออกจากพื้นที่ปลอดภัย อุปกรณ์ L1 สามารถเล่นเนื้อหาได้ถึง 4K HDR จำเป็นต้องได้รับการรับรองจาก Google — เป็นกระบวนการที่อุปกรณ์เรือธงต้องผ่าน
Widevine L3 (ซอฟต์แวร์) — การถอดรหัสจะดำเนินการในหน่วยความจำหลักของอุปกรณ์ ผู้โจมตีที่มีความสามารถทางเทคนิคสามารถแยกคีย์ออกมาได้ ความละเอียดถูกจำกัดที่ 540p (960x540) สำหรับเนื้อหาพรีเมียม อุปกรณ์ Android ทั้งหมดรองรับ L3 แม้ว่าจะไม่ได้รับการรับรองสำหรับ L1
Widevine L2 — ระดับกลางที่หายากซึ่งการถอดรหัสจะดำเนินการใน TEE แต่การเรนเดอร์ผ่านเส้นทางที่ไม่มีการป้องกัน ใช้บนสมาร์ททีวีบางรุ่น แทบไม่พบบนอุปกรณ์มือถือ
import android.media.MediaDrm
import android.media.UUID
fun checkWidevineLevel(): String {
val widevineUuid = UUID.fromString("edef8ba9-79d6-4ace-a3c8-27dcd51d21ed")
val mediaDrm = MediaDrm(widevineUuid)
val securityLevel = mediaDrm.getPropertyString(
MediaDrm.PROPERTY_SECURITY_LEVEL
)
return when (securityLevel) {
"L1" -> "Widevine L1 — การป้องกันฮาร์ดแวร์"
"L3" -> "Widevine L3 — การป้องกันซอฟต์แวร์"
else -> "Widevine $securityLevel"
}
}
เมธอดสอบถาม CDM สำหรับคุณสมบัติ securityLevel ผ่าน UUID ของ Widevine ค่าที่ส่งคืนคือสตริง L1, L2 หรือ L3 ซึ่งระบุระดับการป้องกันปัจจุบันของอุปกรณ์ ข้อมูลนี้สำคัญสำหรับบริการสตรีมมิง: หากอุปกรณ์มีเพียง L3 จะไม่สามารถแสดงเนื้อหา 4K ได้
FairPlay คือระบบ DRM ของ Apple ที่ฝังอยู่ในทุกแพลตฟอร์มของระบบนิเวศ: iOS, iPadOS, macOS, tvOS และ watchOS ต่างจาก Widevine ตรงที่ FairPlay ไม่มีระดับความปลอดภัย — การป้องกันถูกกำหนดโดยอุปกรณ์ บน iOS ที่มี Secure Enclave FairPlay ให้ระดับการป้องกันที่เทียบได้กับ Widevine L1
FairPlay ทำงานเฉพาะกับโปรโตคอล HLS (HTTP Live Streaming) เท่านั้น เนื้อหาถูกบรรจุเป็นเซ็กเมนต์ .ts (MPEG-TS) หรือส่วน .m4s (fMP4) ไฟล์ประกาศ M3U8 มีแท็ก #EXT-X-KEY พร้อม URI ของเซิร์ฟเวอร์สิทธิ์การใช้งาน (KSM — Key Server Module) และ IV เริ่มต้น เมื่อเริ่มเล่น AVPlayer อ่านไฟล์ประกาศและขอคีย์ผ่าน AVContentKeySession
import AVFoundation
let contentKeySession = AVContentKeySession(keySystem: fairPlayStreaming)
let player = AVPlayer(playerItem: playerItem)
contentKeySession.setDelegate(self, queue: delegateQueue)
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
let assetId = keyRequest.identifier as! String
sendLicenseRequest(assetId) { licenseData in
keyRequest.processContentKeyResponse(
AVContentKeyResponse(fairPlayStreamingKeyResponseData: licenseData)
)
}
}
ตัวแทน AVContentKeySession ได้รับคำขอคีย์พร้อมตัวระบุเนื้อหา (assetId) แอปพลิเคชันส่ง ID นี้ไปยังเซิร์ฟเวอร์สิทธิ์การใช้งาน (KSM) ซึ่งส่งคืนคีย์ที่เข้ารหัส การเรียก processContentKeyResponse ส่งคีย์ไปยัง CDM เพื่อถอดรหัส หากสิทธิ์การใช้งานไม่ถูกต้อง (หมดอายุ ไม่ได้ชำระเงิน) เซิร์ฟเวอร์ส่งคืนข้อผิดพลาด 403 และ AVPlayer จะไม่เริ่มเล่น
FairPlay รองรับ คีย์ถาวร — การบันทึกสิทธิ์การใช้งานบนอุปกรณ์สำหรับการดูออฟไลน์ หลังจากได้รับคีย์ แอปพลิเคชันเรียก processContentKeyResponse ด้วยแฟล็ก allowsPersistableKey คีย์จะถูกจัดเก็บใน Keychain และสามารถใช้ได้โดยไม่ต้องติดต่อเซิร์ฟเวอร์ในการเล่นครั้งถัดไป อย่างไรก็ตาม สิทธิ์การใช้งานออฟไลน์มีระยะเวลาที่จำกัด — โดยปกติ 7–30 วัน หลังจากนั้นจำเป็นต้องต่ออายุ
สิทธิ์การใช้งานออฟไลน์ถูกจัดเก็บในที่เก็บที่ได้รับการป้องกันของ iOS — Keychain เมื่อมีความพยายามเจลเบรกหรือแยกดัมพ์ Secure Enclave จะทำลายคีย์ ตาม Apple (2025) เทคโนโลยีคีย์ถาวรถูกใช้ใน Apple TV+, Netflix และ Disney+ สำหรับดาวน์โหลดเนื้อหาลง iPad ก่อนการเดินทาง
PlayReady คือ DRM ของ Microsoft ใช้บน Windows, Xbox และ Windows Phone รุ่นเก่า แม้ว่า PlayReady จะพบได้น้อยบนอุปกรณ์มือถือเมื่อเทียบกับ Widevine และ FairPlay แต่ก็สำคัญสำหรับโซลูชันสตรีมมิงสากลที่ทำงานบนทุกแพลตฟอร์มของ Microsoft PlayReady รองรับทั้งการป้องกันด้วยซอฟต์แวร์และฮาร์ดแวร์ผ่าน TPM
PlayReady ใช้สถาปัตยกรรม SL (Security Level): SL2000 (ซอฟต์แวร์ คล้าย Widevine L3), SL3000 (ฮาร์ดแวร์ คล้าย L1) บน Xbox Series X, PlayReady SL3000 ทำงานผ่าน TEE+TPM — คีย์จะถูกแยกออกเฉพาะในสภาพแวดล้อมที่ได้รับการป้องกันเท่านั้น ซึ่งช่วยให้เล่น 4K Blu-ray บนคอนโซลได้โดยไม่มีความเสี่ยงในการคัดลอก
ตาม Microsoft Docs (2026) PlayReady รองรับ CENC และสามารถทำงานกับ MPEG-DASH ผ่าน Media Source Extensions (MSE) ในเบราว์เซอร์ Edge สำหรับแอปพลิเคชันมือถือบน Android และ iOS PlayReady พร้อมใช้งานผ่าน SDK แต่ไม่ค่อยได้ใช้ — ส่วนใหญ่สำหรับแอปพลิเคชันองค์กรและบริการสื่อของ Microsoft
Microsoft จัดเตรียม PlayReady Native SDK สำหรับ Android และ iOS การรวมทำผ่าน ExoPlayer พร้อมส่วนขยาย PlayReady: นักพัฒนาเพิ่ม PlayReadyRenderer ซึ่งถูกฝังในห่วงโซ่การถอดรหัส ExoPlayer สลับระหว่าง Widevine และ PlayReady โดยอัตโนมัติขึ้นอยู่กับ DRM ที่ระบุในไฟล์ประกาศ MPD
แม้ว่า PlayReady จะไม่ค่อยได้ใช้ในแอปพลิเคชันมือถือ แต่การรองรับนั้นจำเป็นสำหรับบริการภายในระบบนิเวศของ Microsoft — ตัวอย่างเช่น แพลตฟอร์มการฝึกอบรมองค์กรบน SharePoint และ Stream ตาม Microsoft (2025) PlayReady ถูกใช้ใน 23% ของโซลูชันสื่อองค์กร เทียบกับ 62% สำหรับ Widevine
การรวม DRM เข้ากับแอปพลิเคชันมือถือไม่จำเป็นต้องเขียนโค้ดการเข้ารหัส — นักพัฒนาทำงานกับโปรแกรมเล่นที่รองรับ DRM โดยตรง มาดูการรวมบน Android ผ่าน ExoPlayer พร้อมส่วนขยาย DRM
val drmSessionManager = DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(
C.WIDEVINE_UUID,
FrameworkMediaDrm.DEFAULT_PROVIDER
)
.setMultiSession(true)
.build(mediaDrmCallback)
val mediaItem = MediaItem.Builder()
.setUri(mpdUrl)
.setDrmConfiguration(
MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri(licenseUrl)
.setLicenseRequestHeaders(headers)
.build()
)
.build()
exoPlayer.setMediaItem(mediaItem)
exoPlayer.prepare()
DefaultDrmSessionManager จัดการเซสชัน DRM: สร้างเซสชัน MediaDrm, จัดการคำขอสิทธิ์การใช้งาน และส่งคีย์ไปยังตัวถอดรหัส พารามิเตอร์ setMultiSession(true) อนุญาตให้ถอดรหัสหลายสตรีม (เสียง + วิดีโอ) พร้อมกันในเซสชันต่าง ๆ MediaDrmCallback implement คำขอ HTTP ไปยังเซิร์ฟเวอร์สิทธิ์การใช้งาน — โดยทั่วไปคือ POST พร้อมเนื้อหา SignedRequest
val mediaDrmCallback = DefaultDrmSessionManager.MediaDrmCallback {
url, requestBody ->
val response = OkHttpClient().newCall(
Request.Builder()
.url(url)
.post(RequestBody.create(requestBody, MediaType.parse("application/octet-stream")))
.addHeader("Authorization", "Bearer " )
.build()
).execute()
val responseBytes = response.body?.bytes()
?: throw DrmSessionException(Exception("Empty license response"))
responseBytes
}
Callback ส่งคำขอ POST ไปยังเซิร์ฟเวอร์สิทธิ์การใช้งานพร้อม UUID ของ Widevine ในเนื้อหา เซิร์ฟเวอร์ตรวจสอบการรับรองความถูกต้องของผู้ใช้ (โทเค็นในส่วนหัว) และส่งคืนคีย์ที่เข้ารหัส หากผู้ใช้ไม่มีการสมัครสมาชิกที่ใช้งานอยู่ เซิร์ฟเวอร์ส่งคืน 403 Forbidden — ExoPlayer สร้างข้อผิดพลาด DRM ซึ่งต้องจัดการผ่าน onPlayerError
ข้อผิดพลาด DRM เกิดขึ้นเมื่อสิทธิ์การใช้งานไม่ถูกต้อง หมดอายุ หรืออุปกรณ์ไม่รองรับระดับการป้องกันที่ต้องการ ExoPlayer ส่งข้อผิดพลาดผ่าน Player.Listener.onPlayerError ด้วยรหัส TYPE_DRM_LICENSE_EXPIRED, TYPE_DRM_UNSUPPORTED หรือ TYPE_SOURCE แนะนำให้แสดงข้อความที่ให้ข้อมูลแก่ผู้ใช้: “เนื้อหาไม่พร้อมใช้งานสำหรับอุปกรณ์นี้” หรือ “ต่ออายุการสมัครสมาชิกของคุณเพื่อรับชม”
ตามการวิเคราะห์บริการสตรีมมิง (2025) มากถึง 8% ของการเริ่มเล่นที่ล้มเหลวเกี่ยวข้องกับข้อผิดพลาด DRM ในจำนวนนี้ 60% เป็นสิทธิ์การใช้งานหมดอายุ 25% เป็นความไม่เข้ากันของอุปกรณ์ และ 15% เป็นข้อผิดพลาดเครือข่ายระหว่างการขอคีย์ การลองซ้ำอัตโนมัติหลังจาก 5 วินาทีแก้ไข 40% ของกรณีข้อผิดพลาดเครือข่าย
คำถามที่พบบ่อย
เป็นไปได้ในทางเทคนิคบนอุปกรณ์ที่มี Widevine L3 (การป้องกันด้วยซอฟต์แวร์) ซึ่งคีย์สามารถแยกออกจากหน่วยความจำได้ บน L1 และ FairPlay ที่มี Secure Enclave การหลบเลี่ยงทำได้ยากมาก — ต้องมีการเข้าถึง TEE ทางกายภาพ สตูดิโอเนื้อหาเน้นอุปกรณ์ L1 สำหรับเนื้อหาพรีเมียม
เป็นไปได้ว่าอุปกรณ์ไม่ได้รับการรับรองสำหรับ Widevine L1 และใช้ L3 Netflix จำกัดคุณภาพที่ 540p บนอุปกรณ์ L3 ตรวจสอบระดับ Widevine ผ่านแอป DRM Info จาก Google Play อุปกรณ์เรือธงของ Samsung, Pixel และ OnePlus มักจะมี L1
ใช้ Multi-DRM: Widevine สำหรับ Android, FairPlay สำหรับ Apple, PlayReady สำหรับ Windows บริการเช่น Axinom หรือ Vualto ให้ API แบบรวมสำหรับทั้งสามระบบ DRM เนื้อหาถูกเข้ารหัสครั้งเดียวผ่าน CENC และการเลือก DRM เกิดขึ้นโดยอัตโนมัติที่ฝั่งไคลเอ็นต์
บน iOS ใช้ คีย์ถาวร ของ FairPlay ผ่าน AVContentKeySession บน Android ใช้สิทธิ์การใช้งานออฟไลน์ของ Widevine ผ่าน ExoPlayer OfflineLicenseHelper คีย์ถูกจัดเก็บในเครื่องใน Keychain (iOS) หรือ KeyStore (Android) โดยมีระยะเวลาที่จำกัด — โดยปกติ 7 ถึง 30 วัน
KID (Key ID) — ตัวระบุคีย์เข้ารหัสขนาด 16 ไบต์ที่ไม่ซ้ำกันในไฟล์ประกาศ CENC แต่ละ KID ผูกกับส่วนเนื้อหาเฉพาะ (เช่น เซ็กเมนต์ 10 นาทีของภาพยนตร์) เซิร์ฟเวอร์สิทธิ์การใช้งานใช้ KID เพื่อค้นหาคีย์ที่เกี่ยวข้องในฐานข้อมูล ภาพยนตร์เรื่องเดียวอาจมี KID ที่แตกต่างกันมากถึง 20 รายการสำหรับส่วนต่าง ๆ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ