Bỏ qua, đến nội dung
← Tất cả bài viết

tapeshelf mã hóa video thế nào, và vì sao không lưu khóa nào

Video riêng tư trên tapeshelf dành cho chủ sở hữu và những người chủ sở hữu đã chọn. Đây là cách ứng dụng giữ đúng điều đó, và sự bảo vệ dừng lại ở đâu.

Từ tải lên đến phát trực tuyến

Trình duyệt của bạn tải tệp thẳng lên một bucket riêng tư trong bộ lưu trữ tương thích S3, theo từng phần 16 MB có thể tiếp tục nếu mất kết nối. Tệp không bao giờ đi qua các máy chủ API của chúng tôi.

Một worker chạy nền kiểm tra tệp bằng ffprobe, rồi xóa siêu dữ liệu của tệp (nơi và thời điểm quay, máy quay, tác giả, ghi chú) bằng cách ghi lại tệp mà không mã hóa lại hình ảnh. Tệp đã làm sạch đó là tệp mọi người tải xuống. Video tải lên trước ngày 18 tháng 10 năm 2026 vẫn giữ siêu dữ liệu.

Video H.264 tối đa 1080p vượt qua thêm vài bước kiểm tra thì chỉ được đóng gói lại, việc này mất vài giây. Mọi video khác được chuyển sang H.264 tối đa 1080p. Sau đó ffmpeg cắt kết quả thành các phân đoạn HLS dài sáu giây, Safari phát chúng trực tiếp còn các trình duyệt khác phát qua hls.js.

Mã hóa các phân đoạn

ffmpeg tự mã hóa được HLS, nhưng nó cần khóa nằm trong một tệp trên đĩa. Chúng tôi không muốn có khóa trên bất kỳ đĩa nào, nên worker tự mã hóa các phân đoạn:

  • mỗi phân đoạn được mã hóa bằng AES-128 ở chế độ CBC, phương pháp mà chuẩn HLS quy định;
  • khóa dài 16 byte, riêng cho từng video, và chỉ tồn tại trong bộ nhớ của worker khi nó đang làm việc;
  • vectơ khởi tạo là số thứ tự của phân đoạn, đúng như trình phát HLS giả định khi danh sách phát không ghi rõ.

Chỉ các phân đoạn đã mã hóa và danh sách phát của chúng được đưa vào bucket riêng tư. Các tệp tạm của worker bị xóa khi công việc kết thúc.

Khóa không bao giờ được lưu

Sau đó, khóa không được giữ ở đâu cả. Thay vì tạo một khóa ngẫu nhiên rồi canh giữ nó, tapeshelf tạo lại khóa mỗi khi cần:

video key = HKDF-SHA256(master key, "video:" + video id + version) → 16 bytes

Chỉnh sửa video sẽ tăng số phiên bản, và video có khóa mới.

Khóa chủ là một bí mật duy nhất trong cấu hình của máy chủ. Nó không nằm trong cơ sở dữ liệu, các bucket hay bản sao lưu. Một bản sao cơ sở dữ liệu không chứa khóa video nào và bucket chỉ chứa phân đoạn đã mã hóa, nên kẻ tấn công còn cần cả cấu hình của máy chủ.

Mất khóa chủ thì không video nào phát được nữa, và không bản sao lưu cơ sở dữ liệu nào cứu được. Điều này quan trọng nhất nếu bạn chạy tapeshelf trên máy chủ của mình.

Ba yêu cầu khi bạn nhấn phát

  1. Phát. API kiểm tra bạn có được xem không: bạn là tác giả, video nằm trên kệ của bạn, hoặc video công khai. Sau đó API trả về địa chỉ danh sách phát kèm một mã thông báo đã ký, ghi rõ video và bạn (hoặc không ai, nếu bạn chưa đăng nhập), có hiệu lực một giờ.
  2. Danh sách phát. API kiểm tra lại mã thông báo và quyền truy cập của bạn, rồi viết lại danh sách phát ngay lúc đó. Mỗi phân đoạn trở thành một liên kết lưu trữ đã ký, và dòng khóa trỏ ngược về API.
  3. Khóa. Mã thông báo phải dành cho đúng video này. Với video riêng tư, phiên đăng nhập của bạn còn phải thuộc về người được ghi trong mã thông báo. Chỉ khi đó API mới tạo khóa và gửi 16 byte của nó.

Liên kết tạm thời không có tài khoản nào để kiểm tra, nên trên trang của liên kết, mã thông báo ghi tên liên kết. Mỗi yêu cầu kiểm tra liên kết vẫn còn hiệu lực và vẫn chứa video, và mã thông báo không bao giờ sống lâu hơn liên kết. Video khách nhận được qua trao đổi cũng phát theo cách đó trên trang trao đổi, trong một tuần.

Kết quả kiểm tra quyền truy cập được lưu đệm trong một phút, để một bộ phim hai tiếng không truy vấn cơ sở dữ liệu ở mỗi yêu cầu. Video đã xóa vẫn có thể bắt đầu phát trong phút đó. Liên kết tạm thời hết hạn hoặc bị thu hồi thì dừng ngay. Dù thế nào, trình phát đang chạy vẫn giữ khóa và các liên kết phân đoạn của nó và có thể phát tiếp.

Liên kết phân đoạn cũng được ký và hết hạn, sau một giờ hoặc lâu hơn. Trình phát chỉ tải danh sách phát một lần, và liên kết quá ngắn sẽ làm hỏng cả một lần tạm dừng đơn giản. Khi một liên kết hết hạn, trình phát xin lượt phát mới và tiếp tục từ đúng chỗ đó. Dù sao thì không có khóa, phân đoạn cũng vô dụng.

Vì sao không có tệp nào để lấy

Trình phát không bao giờ nhận được liên kết tới tệp video. Nó nhận một danh sách phát gắn với mã thông báo, các mảnh đã mã hóa, và một khóa nằm sau bước kiểm tra. Sao chép địa chỉ danh sách phát của một video riêng tư sang trình duyệt của bạn bè thì không có gì phát được, vì khóa cần phiên đăng nhập của bạn.

Tải xuống là việc riêng. Người đã đăng nhập tải xuống được những gì họ được xem. Không có tài khoản, bạn chỉ tải xuống được qua liên kết tạm thời ai đó đã gửi, hoặc những gì bạn nhận được với tư cách khách khi trao đổi, trong một tuần. Liên kết tải xuống có hiệu lực hai phút.

Hình ảnh thì khác. Ảnh bìa, 16 khung hình lấy từ mỗi video và bản xem trước khung hình tạo từ chúng nằm trong một bucket công khai dưới những cái tên ngẫu nhiên dài, và bucket không thể liệt kê. Bản xem trước của video riêng tư được để lộ có chủ ý: nó cho khách thấy họ sắp yêu cầu gì.

Điều này bảo vệ trước những gì

  • Người không có quyền truy cập không nhận được danh sách phát, phân đoạn hay khóa nào.
  • Liên kết phân đoạn bị lộ chỉ là dữ liệu mã hóa vô nghĩa. Liên kết danh sách phát của video riêng tư bị lộ không dùng được nếu thiếu phiên đăng nhập của người được cấp, và dù sao nó cũng hết hạn trong vòng một giờ.
  • Bản sao cơ sở dữ liệu bị đánh cắp không để lộ khóa nào.

Những gì nó không ngăn được

  • Ai xem được thì ghi lại được. Người có quyền truy cập có thể quay màn hình hoặc lưu luồng phát bằng công cụ phù hợp. Họ được trao khóa một cách hợp lệ. tapeshelf không có DRM. DRM thực sự như Widevine hay FairPlay phụ thuộc vào máy chủ cấp phép thương mại, và vẫn không ngăn được một chiếc máy quay chĩa vào màn hình.
  • Những người bạn chia sẻ cùng. Chia sẻ hay trao đổi trao cho người kia một bản sao vĩnh viễn, và họ có thể tải tệp xuống. Bất kỳ ai mở liên kết tạm thời bạn gửi cũng vậy, khi liên kết còn hiệu lực. Tệp đi đâu sau đó nằm ngoài tầm tay chúng tôi. Hãy chia sẻ với những người bạn tin tưởng.
  • Chính máy chủ. Đây không phải mã hóa đầu cuối. Máy chủ tạo ra khóa, nên ai vận hành máy chủ cũng phát được mọi video. Trên tapeshelf.com, đó là chúng tôi, và chúng tôi mở video riêng tư khi cần để vận hành và kiểm duyệt dịch vụ. Trên một máy chủ tự lưu trữ, đó là quản trị viên.

Bản tóm tắt có ở trang bảo mật. Nếu bạn muốn tự kiểm tra thay vì tin lời chúng tôi, mã nguồn là mã nguồn mở, và bạn sẽ có thể tự chạy nó.