今年三月份的发布在 SteamDB 博客上的一篇文章,介绍了 Steam 的下载系统和预载系统的有关技术原理和细节。
文章向我们提供了一个重要结论:预载游戏可能比起重新开始下载会更消耗时间。
这篇文章里,我们将简要地讨论 Steam 游戏下载和预载系统的工作方式。SteamDB 为了追踪游戏更新情况而实现了下载系统,因此我们对于它的后台的运作方式有了一些认识。
尽管这篇文章是非常技术向的,但是我们希望它能消除人们对于游戏预载及其工作原理的错误认识。
Steam 下载是如何工作的
下载起始于一个仓库清单(depot manifest),该清单(manifest)由唯一的 64 位 ID 标识(可以在 app 信息中查看到)。
这个清单是一个文件列表,包括了加密的文件名、文件大小、文件哈希值(hash)、文件标记(例如:它是一个目录还是一个可执行文件)以及分块元数据(chunk metadata)。
清单里也包含了每个分块(chunk)的如下信息:分块 ID、Adler32 检验、文件偏移量、压缩大小和未压缩大小。
每个文件粗略地分成了 1 MB 大小的分块,每个分块均进行 LZMA 压缩并使用 AES 256 位密钥加密。
每个分块都使用相同的加密密钥进行压缩,清单中的文件名加密压缩也是如此。加密密钥对于仓库(depot)是唯一的,并且对于所有的 Steam 用户都是相同的。这样 CDN 便能有效缓存文件内容,并能让 LAN 缓存正常工作。
只有具备游戏和特定仓库访问权限的 Steam 用户才能请求加密密钥,但一旦有一个用户收到了它,便能够与其他用户共享该密钥。
Steam 预载是如何工作的
上述的所有内容也适用于预载,除了一个小细节有所不同——在游戏发行之后才能访问加密密钥。
Steam 将所有的分块下载到 depotcache 目录的 *.csd 文件当中。当加密密钥可用之后,将其解密。
下载已发行的游戏时,解密过程会在下载时同步进行。但是解密预载文件时,Steam 必须在磁盘上读写数据。因此,如果你的磁盘读写速度较慢,但是网络下载速度较快,则解密预载文件实际上会比起重新下载游戏要花费更长的时间。
为什么暴力破解预载文件是不可行的
这是《反恐精英:全球攻势》仓库 ID 为 731 的仓库密钥,格式为十六进制:BCA9A9CDE94BB4DFF61849C6A87230EE45867A590FDD28826366E35E7D62C08E
它的长度为 256 位,要对其进行暴力破解,需要穷尽 2256 种可能性。
正如维基百科解释的那样:理论上,50 台超级计算机每秒能验证十亿个(1018)AES 密钥,大约需要 3×1051 年才能穷尽 256 密钥空间(此时此刻,地球甚至是宇宙本身可能早已消失)。
如果你听说过量子计算机破坏加密算法的说法,那么你可能也听说过秀尔算法,该算法适用于非对称加密算法。
AES-256 是一种对称加密算法,并且具有量子抵抗。这意味着不能期待着量子计算机能够将破解密码的时间缩短到足够有效的时间。
你可以在 qvault.io 上了解更多关于 AES-256 量子抵抗的信息。
参考文献
Steamworks 文档在此提供了有关内容系统的运作方式。
如果你对更多的技术细节感兴趣,可以查看 DepotDownloader 项目的源代码。