array(5) { ["chapterid"]=> string(8) "46603795" ["articleid"]=> string(7) "6827007" ["chaptername"]=> string(7) "第5章" ["content"]=> string(10719) "第5章 食堂偶遇------------------------------------------ 食堂偶遇,十二点一到,电梯口就开始排队。林深不喜欢排队,通常等到十二点二十分再下去,那时候人少一些,打饭快,找位置也容易。,比平时早了两分钟,因为下午两点有接口联调,他想早点吃完,下午留出时间再过一遍对接文档。,他端着托盘,在几个窗口转了一圈,打了一份红烧肉、一份炒青菜、一碗米饭,加起来十五块,找了个靠窗的位置坐下。,种了几棵树,这个季节叶子还没有完全落,风一吹,稀稀拉拉地掉几片。林深看了一眼,低下头,开始吃饭。"林工。"。,手里端着一个托盘,托盘上是一份沙拉和一杯豆浆。她没有问能不能坐,直接把托盘放在他对面,坐下来。"下午的接口联调,准备好了吗?"她说。,"准备好了。""哪几个接口?""用户认证、数据推送、回调通知,三个主流程,加上异常处理的分支。",拿起叉子,叉了一块沙拉,"上周的进度落后了两天。""我知道。""今天必须追回来。"她说这话的时候,语气平,不是在质问,更像是在陈述一个事实。

周围几张桌子上有同事,有人在聊天,有人在刷手机,有人抬起头看了这边一眼,又低下去了。

林深说:"好。"

顾晚看了他一秒,"下午两点,302。"

"知道了。"

她低下头,继续吃她的沙拉。

林深重新拿起筷子,继续吃饭。两个人都没有再说话,食堂里的噪音填满了他们之间的空白,有人在笑,有人在叫号,有人把托盘放在回收台上发出一声响。

顾晚吃完沙拉,喝了几口豆浆,站起来,拿起托盘,"下午见。"

"嗯。"

她走了。

林深看着她的背影走向回收台,把托盘放下,然后出了食堂。她走路的速度不快不慢,背挺得很直,在人群里不显眼,但也不会被忽略。

他低下头,继续吃饭。

红烧肉有点咸,青菜炒得过了,米饭是今天新蒸的,还好。他把饭吃完,把菜也吃完,没有剩。他不喜欢剩饭,这个习惯从小就有,和节约没有关系,只是觉得开始了就要做完。

他在想顾晚刚才说的那句话:上周的进度落后了两天,今天必须追回来。

这句话本身没有问题。进度确实落后了,原因是玄机科技那边文档改了三次,每次改都要重新对接,时间就这么耗掉了。但这不是顾晚的问题,也不是他的问题,是项目本身的问题。她说这句话,是在陈述事实,还是在施压,还是在做给周围的人看?

他想不出答案,因为这三种可能性都说得通。

他把这个问题放下,重新拿起筷子。红烧肉还是有点咸,但他没有停下来,继续吃。有些问题,想不出答案的时候,放着就好,不需要强行得出结论。等信息足够了,答案自然会出来。

---

小张端着托盘从林深旁边经过,看了一眼顾晚离开的方向,在林深对面坐下,"刚才顾晚找你说什么?"

"说下午联调的事。"

"催进度?"

"提醒进度。"林深说。

小张夹了一筷子菜,"你就这么算了?上周进度落后是因为玄机科技那边文档改了三次,又不是我们的问题。"

"是他们的问题,"林深说,"但进度还是落后了。"

"那也不能这么说话,"小张说,"她那个语气,搁我我得怼回去。"

林深低头吃饭,没有说话。

小张看了他一眼,"你不生气?"

"没什么好生气的。"

小张摇了摇头,"你这个人,"他说,"真的很难懂。"

林深把碗里最后几粒米扒干净,放下筷子,"吃完了,先上去了。"

"这么快?"

"下午还有事。"

小张还想说什么,林深已经站起来了。他把托盘放到回收台,出了食堂,走向电梯。

电梯等了一会儿,里面有三个人,都是同事,他认识,点了个头,各自看手机,没有说话。电梯到三楼,他出去,走廊里安静,午休时间大部分人还没回来,工位区空了一半。

他在自己的工位坐下,没有立刻打开电脑。

他在想小张说的那句话:你就这么算了?

小张的意思是,顾晚当着那么多人说进度落后,是在给他难堪,他应该有所反应,至少应该解释一下原因,说清楚是玄机科技文档的问题,不是他的问题。

但林深觉得这没有意义。解释了又怎样?进度还是落后了两天,解释不能把时间追回来。顾晚说今天必须追回来,这才是重点,其他的都是背景。

他不在意别人怎么看这件事。他在意的是另一件事:顾晚为什么要在食堂说,而不是在工位上发消息,或者在302开会的时候说?

食堂是公开的场合,周围有同事,有人会听到,有人会看到。在那里说这句话,效果和在私下说完全不一样。

他想了两种解释。

第一种:她只是习惯这样,直接,不绕弯子,在哪里遇到就在哪里说,不觉得场合有什么区别。

第二种:她在建立一种印象,让周围的人看到她和林深之间的关系是什么样的——她管项目,他执行,她催进度,他说好。这种印象一旦建立,他们之间的任何接触都会被解读成正常的工作往来,不会引起注意。

第一种解释更简单,更符合奥卡姆剃刀。第二种解释需要更多的前提。

但第二种解释如果是真的,就意味着一件事:顾晚知道他在这里。不是偶然到了这家公司,而是冲着他来的。

这个假设需要更多的证据。他现在没有。

他打开电脑,打开员工档案系统。

他在搜索框里输入了顾晚的名字。

系统返回了一条记录。他点开,看了一遍。

顾晚,产品经理,入职时间是三个月前,推荐人是公司的一个副总,学历是某985高校的计算机系本科,工作经历有三段,分别是两家互联网公司和一家咨询公司,每段经历的时间都对得上,没有空白期。

他往下翻,看了联系方式、紧急联系人、社保记录。

每一项都完整,每一项都经得起查。

他在椅子上坐了一会儿,想了一件事:一份经得起查的档案,有两种可能。第一种,这个人本来就是这样的,档案是真实的。第二种,这份档案是被专门整理过的,每一项都真实,但真实的方式是刻意的。

他在"深海"任务里见过第二种。那种档案,如果你只是查,查不出问题。你需要的不是查,是验证——找到档案里的每一个节点,逐一核实,看有没有哪个地方的真实是被安排出来的。

他没有那个条件做这件事,至少现在没有。

他想了一下顾晚的三段工作经历。两家互联网公司,一家咨询公司。时间都对得上,没有空白期。这种履历,放在任何一个招聘平台上都是正常的,甚至是优质的。

但他注意到一件事:三段经历,每段都是两年左右,换得很规律。不是因为升职,不是因为公司倒闭,是主动离职。每次离职的时间节点,都在项目收尾之后,不早不晚。

这可能是巧合。也可能不是。

他关掉员工档案系统,打开对接文档,开始准备下午的联调。

文档他已经看过两遍了,今天是第三遍,但他还是从头看,因为他想确认一件事:这三个接口,用户认证、数据推送、回调通知,哪一个会经过那个`generateSalt()`函数。

他翻到数据推送接口的说明,找到加密相关的部分,看了一遍。数据推送在传输前会调用SDK的加密模块,加密模块里有密钥派生的步骤,密钥派生会调用`generateSalt()`。

也就是说,每一条被推送的数据,都会经过那个有问题的盐值生成函数。

他在草稿纸上写了一行字:推送数据→加密模块→generateSalt()→可预测密钥。

然后他想了一下,在旁边写了另一行:攻击者需要:服务器实例ID + 时间戳范围。

他把笔放下,看着这两行字。

如果攻击者已经在收集实例ID,那么从今天联调开始,每一条测试数据都是可以被解密的。不是理论上,是实际上。

他把草稿纸翻过去,空白面朝上,压在键盘下面。

然后他打开IDE,把联调需要用到的代码拉出来,检查了一遍,没有问题。他看了一眼时钟,一点五十二分,还有八分钟。

他站起来,去倒了一杯水。

茶水间里有个同事在等热水,看到他,点了个头,"下午有联调?"

"嗯。"

"玄机科技那个项目?"

"对。"

"听说那个SDK挺复杂的,"同事说,"你们搞了多久了?"

"快两周了。"

"顺利吗?"

林深想了一下,"还好。"

同事接了热水,走了。林深倒了杯凉水,回到工位,拿起草稿纸,折好,放进口袋。他看了一眼时钟,一点五十八分,该去302了。他站起来,往走廊方向走。

走廊里,他经过顾晚的工位,她不在,工位上的电脑屏幕是锁屏状态。他没有停,继续往前走。

他在想食堂里那两分钟。

顾晚坐下来,问他准备好了吗,说进度落后了两天,说今天必须追回来。这些话,内容上没有任何问题,是一个产品经理应该说的话。但她坐下来的方式,直接放托盘,不问能不能坐,不是礼貌性的寒暄,是一种很确定的、目的明确的坐法。

他见过这种方式。不是在普通的职场里见过,是在另一种场合里见过。

那种场合里,每一个动作都是有意义的。坐下来的方式,说话的时机,选择的地点,都不是随机的。你不问能不能坐,是因为你已经确定了你要坐,问只是在浪费时间,或者在暴露犹豫。

他不确定顾晚是不是这样想的。但他确定的是,她坐下来的那一刻,他感觉到了某种熟悉的东西。

他把这个念头压下去,继续往前走。走廊里的灯是白色的,午后的光线从窗户斜进来,把地板切成明暗两半。

他推开302的门,走进去。

顾晚已经在了,笔记本打开,屏幕上是接口文档。她抬起头,看了他一眼,"准时。"

"嗯。"林深把椅子拉开,坐下,打开电脑。

他把刚才在走廊里想的那些东西全部放下。现在是联调时间,他需要的是专注,不是分析。那些问题,等联调结束了,有了更多信息,再想。

联调开始了。" ["create_time"]=> string(10) "1776413426" }