文章目录
某用平台滑块-加密流程分析rsa、base64
声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在主页联系作者立即删除!
目标和接口
**目标:**滑动拼图验证成功
接口:aHR0cHM6Ly94eGdzLmNoaW5hbnBvLm1jYS5nb3YuY24vZ3N4dC9uZXdsaXN0
1. 请求流程分析
整个验证流程分为四个步骤:
- 获取验证码信息 接口请求
- 识别滑动距离 本地图像识别
- 构建加密参数 (RSA + Base64)
- 提交验证并获取业务数据 接口请求
2. 请求参数分析
2.1 第一步:获取验证码图片与盐值信息
直接向接口 c2xpZGVDYXB0Y2hh 发起 GET 请求,注意携带cookie。
响应结构分析:
{
"code": 200,
"result": {
"a": "Base64String...", // 随机盐值或标识 A
"b": "Base64String...", // 随机盐值或标识 B
"c": {
"oriImage": "Base64String...", // 背景大图
"cutImage": "Base64String...", // 滑块小图
"cutImageWidth": 40, // 滑块宽度
"xpos": 0, // 初始X坐标
"ypos": 7 // 初始Y坐标
}
}
}
2.2 第二步:图像预处理与距离识别
前端返回的图片是 Base64格式,需要将其转换为本地图片文件,以便进行识别。
关键点:
oriImage是包含缺口的背景图。cutImage是需要移动的滑块图。- 使用
ddddocr方法可以自动计算滑块需要移动的距离,注意计算距离时要考虑滑块宽度的偏移量。
代码实现:
def base64_to_image(base64_str, output_path):
if "," in base64_str:
base64_str = base64_str.split(",")[1]
image_data = base64.b64decode(base64_str)
image = Image.open(BytesIO(image_data))
image.save(output_path)
return image
# 在 run 函数中调用
base64_to_image(captcha_info["c"]["cutImage"], "cut_image.png")
base64_to_image(captcha_info["c"]["oriImage"], "ori_image.png")
# 识别距离
slide_info = get_real_slide_distance(
"ori_image.png",
"cut_image.png",
captcha_info["c"]["cutImageWidth"]
)
slide_distance = slide_info["slide_distance"]
2.3 第三步:参数加密构造 (核心难点)
2.3.1 加密逻辑分析

根据全局搜索代码,分析加密逻辑如下:
- 参数 a:
Base64( UTF8(原始a) )- 对接口返回的
a字符串进行 UTF-8 编码,再做一次 Base64 编码。
- 对接口返回的
- 参数 b:
Base64( UTF8(原始b) )- 对接口返回的
b字符串进行 UTF-8 编码,再做一次 Base64 编码。
- 对接口返回的
- 参数 c:
Base64( UTF8( RSA_Encrypt(滑动距离) ) )- Step 1: 将滑动距离(整数/字符串)转换为字符串。
- Step 2: 使用 RSA 公钥对字符串进行加密。填充模式为
PKCS1_v1_5。 - Step 3: 将加密后的二进制数据转为 Base64 字符串。
- Step 4: 注意! 代码中对该 Base64 字符串又做了一次
UTF8编码 -> Base64编码的处理(双重 Base64)。
2.3.2 RSA 公钥提取
从 JavaScript 源码或网络请求中可以提取到 RSA 公钥:
-----BEGIN PUBLIC KEY-----
****************替换真实公钥***************
-----END PUBLIC KEY-----
Python 实现 RSA 加密
# 构建以上真实的公钥,使用标准rsa和base64即可
2.4 第四步:提交验证
将构造好的参数发送给验证接口 c2xpZGVfY2FwdGNoYV9jaGVjaw==。
参数: a, b, c
如果验证成功,服务器会返回 code: 200。此时,这些参数a, b, c可以用于后续的业务数据查询。
3. 总结
这个案例还是很简单了,大家快动手做起来吧!
关键参数: v: luobidamidi001
以下是运行效果演示:

感谢关注【遇事不決洛必達】!欢迎点赞收藏和交流指正,我会持续分享我的学习经验和心得。

1164

被折叠的 条评论
为什么被折叠?



