Cara tapeshelf mengenkripsi video, dan mengapa tidak menyimpan kunci

Video privat di tapeshelf ditujukan untuk pemiliknya dan orang-orang yang dipilih pemiliknya. Inilah cara aplikasi memegang janji itu, dan di mana batas perlindungannya.
Dari unggahan sampai stream
Browser Anda mengunggah file langsung ke bucket privat di penyimpanan yang kompatibel dengan S3, dalam bagian berukuran 16 MB yang bisa dilanjutkan jika koneksi terputus. File tidak pernah melewati server API kami.
Worker di latar belakang memeriksa file dengan ffprobe, lalu menghapus metadatanya (tempat dan waktu perekaman, kamera, pembuat, komentar) dengan menulis ulang file tanpa encoding ulang. File yang sudah dibersihkan itulah yang diunduh orang. Video yang diunggah sebelum 18 Oktober 2026 tetap menyimpan metadatanya.
Video H.264 hingga 1080p yang lolos beberapa pemeriksaan tambahan hanya dikemas ulang, yang memakan waktu beberapa detik. Selebihnya dikonversi ke H.264 hingga 1080p. ffmpeg lalu memotong hasilnya menjadi segmen HLS berdurasi enam detik, yang diputar Safari secara bawaan dan browser lain lewat hls.js.
Mengenkripsi segmen
ffmpeg bisa mengenkripsi HLS sendiri, tetapi ia membutuhkan kunci dalam file di disk. Kami tidak ingin ada kunci di disk mana pun, jadi worker mengenkripsi segmen sendiri:
- setiap segmen dienkripsi dengan AES-128 dalam mode CBC, metode yang ditetapkan standar HLS;
- kuncinya berukuran 16 byte, unik untuk setiap video, dan hanya ada di memori worker selama bekerja;
- vektor inisialisasinya adalah nomor urut segmen, yang memang diasumsikan pemutar HLS jika playlist tidak menyebutkannya.
Hanya segmen terenkripsi dan playlist-nya yang masuk ke bucket privat. File sementara worker dihapus saat pekerjaan selesai.
Kunci yang tidak pernah disimpan
Setelah itu, kunci tidak disimpan di mana pun. Alih-alih membuat kunci acak lalu menjaganya, tapeshelf menurunkan kunci setiap kali dibutuhkan:
video key = HKDF-SHA256(master key, "video:" + video id + version) → 16 bytes
Mengedit video menaikkan versinya, sehingga video mendapat kunci baru.
Kunci induk adalah satu rahasia dalam konfigurasi server. Kunci itu tidak ada di database, bucket, atau cadangan. Salinan database tidak berisi kunci video dan bucket hanya berisi segmen terenkripsi, jadi penyerang juga memerlukan konfigurasi server.
Jika kunci induk hilang, tidak ada video yang bisa diputar lagi, dan tidak ada cadangan database yang bisa mengembalikannya. Hal ini paling penting jika Anda menjalankan tapeshelf di server sendiri.
Tiga permintaan saat Anda menekan putar
- Pemutaran. API memeriksa apakah Anda boleh menonton: Anda pembuatnya, video ada di rak Anda, atau video itu publik. Lalu API mengembalikan alamat playlist berisi token bertanda tangan, yang menyebut video dan Anda (atau tidak menyebut siapa pun, jika Anda belum masuk), berlaku selama satu jam.
- Playlist. API memeriksa token dan akses Anda lagi, lalu menulis ulang playlist saat itu juga. Setiap segmen menjadi tautan penyimpanan bertanda tangan, dan baris kunci mengarah kembali ke API.
- Kunci. Token harus untuk video ini. Untuk video privat, sesi masuk Anda juga harus milik orang yang disebut dalam token. Baru setelah itu API menurunkan kunci dan mengirim 16 byte-nya.
Tautan sementara tidak punya akun untuk diperiksa, jadi di halamannya token menyebut tautan itu. Setiap permintaan memeriksa bahwa tautan masih berlaku dan masih berisi video itu, dan token tidak pernah berumur lebih panjang dari tautannya. Video yang diterima tamu dalam pertukaran diputar dengan cara yang sama di halaman pertukaran, selama satu minggu.
Keputusan akses disimpan di cache selama satu menit, agar film berdurasi dua jam tidak membebani database di setiap permintaan. Video yang sudah dihapus masih bisa dimulai dalam satu menit itu. Tautan sementara yang kedaluwarsa atau dicabut langsung berhenti. Dalam kedua kasus, pemutar yang sudah berjalan tetap memegang kunci dan tautan segmennya dan mungkin terus memutar.
Tautan segmen juga bertanda tangan dan kedaluwarsa, setelah satu jam atau lebih. Pemutar memuat playlist sekali, dan tautan yang terlalu pendek akan merusak jeda sederhana. Saat satu tautan kedaluwarsa, pemutar meminta pemutaran baru dan melanjutkan dari titik yang sama. Tanpa kunci, segmen tetap tidak berguna.
Mengapa tidak ada file untuk diambil
Pemutar tidak pernah mendapat tautan ke file video. Pemutar mendapat playlist yang terikat pada token, potongan terenkripsi, dan kunci yang dijaga pemeriksaan. Salin alamat playlist video privat ke browser teman, dan tidak ada yang diputar, karena kuncinya memerlukan sesi Anda.
Mengunduh adalah hal terpisah. Orang yang sudah masuk bisa mengunduh apa yang boleh mereka tonton. Tanpa akun, Anda hanya bisa mengunduh lewat tautan sementara yang dikirim seseorang kepada Anda, atau yang Anda terima sebagai tamu dalam pertukaran, selama satu minggu. Tautan unduhan berlaku dua menit.
Gambar bekerja secara berbeda. Sampul, 16 frame yang diambil dari setiap video, dan pratinjau frame yang dibuat darinya disimpan di bucket publik dengan nama acak yang panjang, dan isi bucket tidak bisa didaftar. Pratinjau video privat sengaja dibuat terlihat: pratinjau menunjukkan kepada pengunjung apa yang akan mereka minta.
Apa yang dilindungi
- Orang tanpa akses tidak mendapat playlist, segmen, maupun kunci.
- Tautan segmen yang bocor hanyalah data acak terenkripsi. Tautan playlist video privat yang bocor tidak berfungsi tanpa sesi orang yang menerimanya, dan toh kedaluwarsa dalam satu jam.
- Salinan database yang dicuri tidak mengungkap kunci apa pun.
Apa yang tidak dilindungi
- Siapa pun yang bisa menonton bisa merekam. Orang yang punya akses bisa merekam layarnya atau menyimpan stream dengan alat yang tepat. Mereka mendapat kuncinya secara sah. tapeshelf tidak memakai DRM. DRM sungguhan seperti Widevine atau FairPlay bergantung pada server lisensi komersial, dan tetap tidak bisa mencegah kamera yang diarahkan ke layar.
- Orang yang Anda ajak berbagi. Berbagi atau bertukar memberi orang lain salinan permanen, dan mereka bisa mengunduh file-nya. Begitu pula siapa pun yang membuka tautan sementara yang Anda kirim, selama tautan masih berlaku. Apa yang terjadi pada file itu selanjutnya di luar jangkauan kami. Berbagilah dengan orang yang Anda percayai.
- Server itu sendiri. Ini bukan enkripsi end-to-end. Server menurunkan kunci, jadi siapa pun yang menjalankannya bisa memutar video apa pun. Di tapeshelf.com, itu adalah kami, dan kami membuka video privat jika diperlukan untuk menjalankan dan memoderasi layanan. Di instans yang di-host sendiri, itu adalah adminnya.
Versi singkatnya ada di halaman keamanan. Jika Anda lebih suka memeriksa sendiri daripada percaya begitu saja, kodenya open source, dan Anda akan bisa menjalankannya sendiri.