Bilibili上观看视频的时候,看到一行行飞过的弹幕,经常会好奇这些弹幕出自何人之手。但是,B 站却没能让我们轻松如愿,它在弹幕上加入了一定的匿名机制。

那么,如何破除这一匿名机制,找到弹幕背后的主人呢?让我们一探究竟。

第一步是拿到弹幕数据。B 站的视频资源和弹幕资源都是通过一个叫做“CID”的参数索引的。用 PC 端的网页浏览器打开任意一个 B 站的视频,右击鼠标进入“查看页面源代码”,便可以在当前版本的 B 站 HTML 代码 415 行处,找到这样一行:

<script type='text/javascript'>EmbedPlayer('player', "//static.hdslb.com/play.swf", "cid=xxxxxxx&aid=xxxxxxx&pre_ad=0");</script>

其中cid=后面所跟着的一串字符,便是这个视频的 CID 了。随后,访问下面这个 URL 就可以拿到原始的弹幕数据。

http://comment.bilibili.com/[CID].xml

所能拿到的弹幕数据如下:

<d p="10.651000022888,1,25,0,1497509751,0,e576a200,3459527834">第一!</d>
<d p="2654.9799804688,5,25,16777215,1497510085,0,e576a200,3459553825">ED 后有正片!</d>
<d p="16.614999771118,1,25,16777215,1497510472,0,5aa91470,3459564042">来啦!</d>

当然,这一数据也可以通过抓包取得:

抓包

随后,我们分析这一数据,可以看到,每一条弹幕都附加了几个属性值,像这样

<d p="10.651000022888,1,25,0,1497509751,0,e576a200,3459527834">

其中,从右边数,第二项就是弹幕发送者的信息。这里是e576a200

B 站是通过 UID 这个东西来标记用户的,例如,我的 B 站空间的地址是

http://space.bilibili.com/7932564/ 

那么,我的 UID 就是 7932564。但是显然,弹幕数据里的那个东西不是我们在 B 站用户空间看到的UID。

我参考了这篇文章。文中提到,这一串奇怪的 16 进制数据,其实是用户的 UID 经过一个哈希之后所输出的结果:

只是简单的把数字 ID 用 ITU I.363.5 算法进行了 Hash

只是 ITU I.363.5 算法究竟是个什么鬼?经过一番查证之后,我发现,原来这个哈希算法就是通信中常用的循环冗余校验(CRC),这里使用的是它的一个变体 CRC32。

这样,事情就变得简单多了。目前 B 站的用户总数不过 1 亿上下,因此这个 CRC32 函数的输入空间也就 10^8,即使是暴力破解也绰绰有余。

刚才上面提到的弹幕数据是我发送的,UID 的 CRC32 校验和为e576a200。我写了四行简单的 Python 脚本尝试暴力破解。

import binascii

for i in range(1,100000000):
    if binascii.crc32(str(i).encode("utf-8")) == 0xe576a200:
        print(i)

该程序成功输出了我的 UID,但是整个运行时间较长,在我的电脑上(i5-7500U)花费了约半分钟。考虑到 Python 3.6 的缓慢,这个时间还是可以接受的,如果使用 C 语言编写,再加上优化和多核并行,降到 1 秒以内应该问题不大。但是如果需要线上部署的话,可能就要和这个反查工具一样,使用彩虹表进一步提速。

但是,上文的反查工具有一个缺陷,它针对每一个 32 位无符号整数的输入,只会输出一个 UID。但是,由于 CRC32 的输出空间只有 42 亿,所以很容易出现多个 UID 的 CRC32 校验和相同的情况。例如这个校验和:a8b1349a,通过反查工具只能够得到一个 UID:23380127,但是如果使用 Python 脚本暴力破解,会得到三个可能的 UID,分别是:23380127, 38565392, 81938466。也就是说,这三个用户都有可能是某条弹幕的主人。

这也就牵涉到了另一个问题,当我们在 B 站屏蔽某个用户的弹幕时,我们实际上屏蔽的是其 CRC32 校验和而非 UID,如果多个 UID 的 CRC32 校验和相同,就会出现误伤无辜群众的现象。这显然是 B 站在早期架构设计时的失误,在我注册时,其用户不过数百万,而今却已经破亿,显然他们根本不会预料到,当初自己搭建的这个半娱乐的性质的 Mikufans,会在某一天超过优酷,成为当今中国最大的视频网站(来源:Amazon Alexa)。