跳到正文
← 全部文章

tapeshelf 如何加密视频,以及为什么不保存密钥

tapeshelf 上的私密视频只属于它的所有者和所有者选定的人。下面讲讲应用是怎么做到这一点的,以及保护到哪里为止。

从上传到播放

你的浏览器把文件直接上传到 S3 兼容存储里的一个私有存储桶,每块 16 MB,断网后可以续传。文件从不经过我们的 API 服务器。

后台进程先用 ffprobe 检查文件,再去掉其中的元数据(拍摄地点和时间、相机、作者、备注)。这一步只重写文件,不重新编码。大家下载的就是清理后的文件。2026 年 10 月 18 日之前上传的视频仍保留元数据。

最高 1080p、再通过几项检查的 H.264 视频只需重新封装,几秒钟就好。其他视频会转码成最高 1080p 的 H.264。然后 ffmpeg 把结果切成每段六秒的 HLS 分片,Safari 原生就能播放,其他浏览器通过 hls.js 播放。

加密分片

ffmpeg 本身就能加密 HLS,但它要求密钥放在磁盘上的文件里。我们不想让密钥出现在任何磁盘上,所以由后台进程自己加密分片:

  • 每个分片用 AES-128 的 CBC 模式加密,这是 HLS 标准规定的方式;
  • 密钥长 16 字节,每个视频各不相同,只在后台进程工作时存在于内存中;
  • 初始化向量就是分片的序号,播放列表没有指定时,HLS 播放器默认的也正是这个值。

私有存储桶里只存放加密后的分片和它们的播放列表。任务结束后,后台进程的临时文件会被删除。

从不保存的密钥

此后,密钥不保存在任何地方。tapeshelf 并不生成一个随机密钥再小心看管,而是在每次需要时把它推导出来:

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

编辑视频会让版本号加一,视频也就有了新的密钥。

主密钥是服务器配置里的一个机密,不在数据库里,不在存储桶里,也不在备份里。数据库的副本里没有任何视频密钥,存储桶里只有加密的分片,所以攻击者还得拿到服务器的配置才行。

一旦丢失主密钥,所有视频都再也无法播放,数据库备份也救不回来。如果你在自己的服务器上运行 tapeshelf,这一点尤其重要。

按下播放时的三个请求

  1. 播放。API 检查你是否有权观看:你是作者,视频在你的片架上,或者视频是公开的。然后返回一个播放列表地址,里面带着签名令牌,写明是哪个视频、是谁(未登录时不指定任何人),有效期一小时。
  2. 播放列表。API 再次检查令牌和你的权限,并即时改写播放列表:每个分片都变成一个带签名的存储链接,密钥那一行则指回 API。
  3. 密钥。令牌必须对应这个视频。如果是私密视频,你当前登录的会话还必须属于令牌里写明的那个人。只有这样,API 才会推导出密钥,发送那 16 个字节。

限时链接没有账号可查,所以在它的页面上,令牌写明的是这个链接。每个请求都会检查链接是否仍然有效、是否仍包含这个视频,令牌的有效期也绝不会超过链接本身。游客在交换中收到的视频,在交换页面上也以同样的方式播放,为期一周。

权限判断会缓存一分钟,这样一部两小时的电影不必每个请求都查一次数据库。在这一分钟内,已删除的视频仍然可能被开始播放。限时链接一旦到期或被撤销,会立刻失效。无论哪种情况,已经在播放的播放器手里还有密钥和分片链接,可能会继续播下去。

分片链接同样带签名、会过期,有效期一小时或更长。播放器只加载一次播放列表,链接太短的话,简单暂停一下就会出问题。链接过期时,播放器会重新请求播放,从同一位置接着放。反正没有密钥,分片也毫无用处。

为什么没有文件可拿

播放器从来拿不到视频文件的链接。它拿到的是一个绑定令牌的播放列表、一堆加密的片段,以及一把要经过检查才能拿到的密钥。把私密视频的播放列表地址复制到朋友的浏览器里,什么也放不出来,因为密钥需要你的会话。

下载是另一回事。已登录的用户可以下载自己有权观看的视频。没有账号的话,只能通过别人发给你的限时链接下载,或者下载你作为游客在交换中收到的视频,为期一周。下载链接的有效期是两分钟。

图片的处理方式不同。封面、从每个视频里取出的 16 帧,以及用它们拼成的帧预览,都放在一个公开存储桶里,文件名是很长的随机字符串,而且这个存储桶无法列出内容。私密视频的预览是有意公开的:它让访客知道自己要请求的是什么。

这能防住什么

  • 没有权限的人拿不到播放列表、分片,也拿不到密钥。
  • 泄露的分片链接只是一堆加密的乱码。泄露的私密视频播放列表链接,没有它所签发对象的会话就无法使用,而且一小时内就会过期。
  • 被盗的数据库副本里没有任何密钥。

防不住什么

  • 能观看的人就能录下来。有权限的人可以录屏,或者用合适的工具保存视频流。密钥是正当地给了他们的。tapeshelf 没有 DRM。Widevine、FairPlay 这样真正的 DRM 依赖商业授权服务器,而且照样挡不住对着屏幕拍的相机。
  • 你分享给的人。分享或交换会让对方得到一份永久副本,他们也可以下载文件。打开你发出的限时链接的人,在链接有效期间同样可以。文件之后会怎样,就不在我们的掌控之内了。请只分享给你信任的人。
  • 服务器本身。这不是端到端加密。密钥由服务器推导,所以运行服务器的人可以播放任何视频。在 tapeshelf.com 上,这个人是我们,我们会在运营和审核服务需要时打开私密视频。在自托管的实例上,这个人是管理员。

简短的说明见安全页面。如果你更愿意亲自核实而不是听我们说,代码是开源的,你也将可以自己运行它。