逆向解析:小红书设备指纹device_fingerprint与xy_ter_str的HMAC签名机制

1. 从抓包数据看小红书的“身份证”与“通行证”

最近在研究一些App的接口安全机制,正好拿小红书iOS版练了练手。抓了几个请求包,一眼就看到几个特别显眼的字段:device_fingerprintxy_ter_str。这俩东西,一个长得像带时间戳的乱码,另一个则是一长串标准的Base64编码字符串,明显不是随便生成的。对于做安全分析或者移动端逆向的同学来说,这种字段就像黑夜里的灯塔,告诉你“这里有故事”。

我们先看看抓包抓到的实际数据(为了演示,我用了脱敏后的样本):

{
  "deviceId": "2DE2BFA8-D5C9-4A69-AC14-B73088CD127A",
  "device_fingerprint": "20250502150236f30d08d19ce37d6e9ad7bf7e8afce066002ffff3a23e05f0",
  "xy_ter_str": "Bq6GSLv2AzmonBtIACTCwGLv8pB9u1DoNTIbR6Fk6+iaLg3VdBHRXK3GlnZd2KuoX9aid5cCNthYmElztyb5dcZlYvJPQukTSZY2Z2f/DtQ1Fj/tj7F6MeDt3eSGtPwd"
}

deviceId 大家都很熟悉,通常是系统生成的UUID,比如iOS的 [[UIDevice currentDevice] identifierForVendor],它相对静态,重装App可能会变。但 device_fingerprintxy_ter_str 就不同了,它们每次请求都可能变化,显然是动态生成的,而且大概率参与了请求合法性的校验。

你可以把 device_fingerprint 理解为设备的“动态身份证”。它前半部分 20250502150236 很明显是一个精确到秒的时间戳(2025年5月2日15点02分36秒),后半部分则是一串十六进制字符串。这个组合透露了两个关键信息:第一,这个指纹具有时效性,不是永久不变的;第二,它很可能由时间戳和某种设备特征信息(可能是硬件信息、系统参数、应用状态等)经过计算后生成。服务器拿到后,可以通过解析时间戳判断这个“身份证”是否新鲜,是否在有效期内,从而防止重放攻击(即拦截一个合法请求然后重复发送)。

xy_ter_str 就更像是一个“一次性通行证”或者“数字签名”。它的长度固定,符合Base64编码特征,看起来是对某些数据进行HMAC(哈希消息认证码)签名后的结果。HMAC是一种基于密钥的哈希算法,它能够保证数据的完整性和真实性。简单来说,客户端用一把只有它和服务器知道的“密钥”,对特定的消息(比如 device_fingerprint、请求参数、时间戳等)进行哈希计算,生成这个 xy_ter_str。服务器收到后,用同样的密钥和规则再算一遍,如果结果对得上,就证明这个请求确实来自合法的客户端,且数据在传输途中没有被篡改。

所以,这套机制的核心目的就清晰了:防伪造、防篡改、防重放。小红书通过动态的 device_fingerprint 和基于HMAC的 xy_ter_str,为每个请求打造了一个“身份+签名”的双重保险。这对于对抗黑产批量注册、刷量、爬虫等行为非常有效。接下来,我们就一步步拆解,看看这两个关键字段到底是怎么来的。

2. 拆解 device_fingerprint:不只是时间戳那么简单

光看 device_fingerprint 的格式 20250502150236f30d08d19ce37d6e9ad7bf7e8afce066002ffff3a23e05f0,我们就能做初步的推断。前14位是 YYYYMMDDHHMMSS 格式的时间戳,这个几乎没跑。剩下的部分,长度不固定,但看起来是十六进制字符(0-9, a-f)。这后半部分才是真正的“指纹”本体。

我一开始猜测,后半部分可能只是简单的MD5或SHA1。于是我把时间戳去掉,对剩下的十六进制串进行了一些常见哈希的逆向比对,比如尝试把它当作哈希值去反查,或者当作明文去计算哈希,但都没对上。这说明它的生成逻辑更复杂一些。后来通过动态调试和静态分析iOS客户端的二进制文件,发现它的生成路径大致是这样的:

  1. 采集设备信息:应用会收集一系列设备和环境参数。这些参数可能包括(但不限于):

    • 硬件标识:如 identifierForVendor (IDFV)、 advertisingIdentifier (IDFA,在用户授权后) 的哈希或部分字节。
    • 系统信息:系统版本、设备型号(如 iPhone15,2)、屏幕分辨率、内核版本等。
    • 应用信息:Bundle ID、版本号、安装时间、沙盒目录的某些特征。
    • 动态状态:设备启动时间、当前电量、磁盘空间等。
    • 网络信息:MAC地址的哈希(iOS 7后无法直接获取,但可能有历史缓存)、蜂窝网络运营商代码。
  2. 信息归一化与拼接:将这些信息转换成字符串,并按照一个固定的顺序和分隔符拼接成一个长的“信息字符串”。这个顺序和分隔符是算法的一部分,客户端和服务器必须一致。

  3. 首次哈希与截取:对这个“信息字符串”进行一次哈希运算(可能是SHA256)。得到的哈希值是一个字节数组,通常不会直接全部使用,而是会截取其中特定长度(比如16字节或20字节)的部分。

  4. 结合时间戳:获取当前精确到秒的UTC时间,格式化为 YYYYMMDDHHMMSS。然后将这个时间戳字符串,与上一步截取到的哈希字节数组的十六进制表示,直接拼接起来。

  5. 可能的二次编码或混淆:有些实现为了增加逆向难度,可能会对拼接后的字符串再进行一次简单的可逆变换,比如与一个固定字节进行XOR,或者进行特定的字节位置置换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值