【验证码系列】某用平台滑块-加密流程分析rsa、base64

某用平台滑块-加密流程分析rsa、base64

声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在主页联系作者立即删除!

目标和接口

**目标:**滑动拼图验证成功
接口:aHR0cHM6Ly94eGdzLmNoaW5hbnBvLm1jYS5nb3YuY24vZ3N4dC9uZXdsaXN0

1. 请求流程分析

整个验证流程分为四个步骤:

  1. 获取验证码信息 接口请求
  2. 识别滑动距离 本地图像识别
  3. 构建加密参数 (RSA + Base64)
  4. 提交验证并获取业务数据 接口请求

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 加密逻辑分析

在这里插入图片描述

根据全局搜索代码,分析加密逻辑如下:

  1. 参数 a: Base64( UTF8(原始a) )
    • 对接口返回的 a 字符串进行 UTF-8 编码,再做一次 Base64 编码。
  2. 参数 b: Base64( UTF8(原始b) )
    • 对接口返回的 b 字符串进行 UTF-8 编码,再做一次 Base64 编码。
  3. 参数 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

以下是运行效果演示:

在这里插入图片描述


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇事不決洛必達

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值