浅谈Akamai算法

前言

最近有事情所以拖了蛮久的,现在我们来分析下Akamai的算法。我将更侧重算法层的分析

设备指纹

1
2
3
4
5
6
7
8
{
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
screen: { width: 1920, height: 1080, colorDepth: 24 },
timezone: "Asia/Shanghai",
language: "zh-CN",
platform: "Win32",
timestamp: Date.now()
};

我简单举个例子这个是环境的参数是可以直接参加计算的

生成传感器数据对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
ver: "3.0.1", // 版本号
fpt: deviceFingerprint.hash, // 指纹哈希
fpc: deviceFingerprint.count, // 指纹计数
ajr: "", // Ajax请求数据
din: this.getDeviceInfo(), // 设备信息
eem: "", // 事件错误管理
ffs: "", // 表单字段
vev: "", // 视频事件
inf: this.getRandomString(8), // 信息
ajt: 0, // Ajax类型
kev: "", // 键盘事件
dme: "", // DOM事件
mev: this.getMouseEvents(), // 鼠标事件
doe: "", // 其他事件
pur: "", // 页面卸载
pev: "", // 页面事件
mst: "", // 鼠标状态
o9: this.getRandomString(16), // 特殊数据
tev: "", // 触摸事件
sde: "", // 传感器数据事件
pmo: "", // 页面移动
dpw: "", // 显示密码
pac: 0, // 页面访问计数
per: this.getPerformanceData(), // 性能数据
dsi: [], // 设备传感器信息
wsl: "", // WebSocket日志
hls: "", // HTTP日志
pde: "", // 页面描述事件
oev: "", // 其他扩展事件
if: this.getRandomString(12) // 接口数据
};

获取设备信息

1
2
3
4
5
6
7
8
9
10
11
12
13
getDeviceInfo() {
return {
ua: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
lg: "zh-CN",
pf: "Win32",
ce: true,
sw: 1920,
sh: 1080,
cd: 24,
tz: "Asia/Shanghai",
ts: Date.now()
};
}

我将尽可能的说出重点但设备信息的方面我不能讲太多的东西

生成随机字符串

前面的步骤,这个是用户唯一性的

数据洗牌算法

字符替换加密

最后是一些拼接的操作

一些版本号的拼接和字符串替换组成了最后的参数

致谢

最后感谢B站mz大佬的解混淆代码