LINUX SB 快照站

用户 ID 692 · 当前名首次快照 2026-08-12 10:15:21 · 当前名始于 2026-08-12 10:15:21 · 原站主页: https://linux.sb/user/692

发言

共 44 楼

来看看爷写的调节显示器亮度软件精华
#12 · 爷
发帖 2026-08-18 07:53:49 · 快照 2026-08-18 07:56:17

@lawwaikit #11 能帮到忙就好,哈哈

这里有多少Linux Do元老级用户(2024年上半年注册的)
#14 · 爷
发帖 2026-08-17 17:28:56 · 快照 2026-08-17 20:13:41

种子用户来咯

来看看爷写的调节显示器亮度软件精华
#10 · 爷
发帖 2026-08-17 11:47:22 · 快照 2026-08-18 07:56:17

@签到 #9 好的,等后面有时间更新一下

网易易盾滑块纯算逆向记录精华
#14 · 爷
发帖 2026-08-17 11:47:04 · 快照 2026-08-17 20:25:17

@神居于天 #13 那必须可以啊

置顶发布真实经验教程 获取积分投币 以及创作者身份
#23 · 爷
发帖 2026-08-16 17:50:02 · 快照 2026-08-16 17:51:46

明天签到积分就够了,提前申请一下😄

有的人可能不认识我
#48 · 爷
发帖 2026-08-16 17:48:59 · 快照 2026-08-16 17:49:52

喜不喜欢neo的批量封号😆

网易易盾滑块纯算逆向记录精华
#11 · 爷
发帖 2026-08-16 14:37:53 · 快照 2026-08-16 14:39:04

@哈雷彗星 #10 禁止贴脸开大

【本周话题】如何推广LinuxSB烧饼社区?
#5 · 爷
发帖 2026-08-16 13:33:14 · 快照 2026-08-16 13:33:20

可以的话还是搞个oauth,这样有什么服务可以绑定烧饼站

uid和昵称
#14 · 爷
发帖 2026-08-16 12:57:45 · 快照 2026-08-16 12:59:02

笑死了,我这个咋样

网易易盾滑块纯算逆向记录精华
#7 · 爷
发帖 2026-08-16 11:52:04 · 快照 2026-08-16 11:52:59

@痛失姓名的站长 #5 做大做强哈哈

网易易盾滑块纯算逆向记录精华
#3 · 爷
发帖 2026-08-16 11:47:57 · 快照 2026-08-16 11:48:50

@roiding #1 哈哈哈,这种程度的逆向都不需要skill

网易易盾滑块纯算逆向记录精华
#0 · 爷
发帖 2026-08-16 11:42:05 · 快照 2026-08-17 20:25:17

目标:看雪登录(passport.kanxue.com)的网易易盾滑块,纯 Node 全自动通过。
结果:/api/v3/check 返回 result:true,连续 5/5;最终 validate 提交看雪登录接口被接受。

版本信息(所有结论绑定此版本):

验证码 IDe019d55cf18348519c201a0d2f80ebfb
加载器load.min.js v2.5.4
corecore-optimi.m25b40.v2.28.5.min.js(631KB)
协议c.dun.163.com/api/v3/*

一、抓包:三个接口

登录页点出滑块,Network 里就三个接口:

接口作用关键参数
GET /api/v2/getconf初始化配置返回 dtresourcesapiServerstaticServers
GET /api/v3/get拉验证码fpcbdtid…返回 token + 背景图/拼图 URL
GET /api/v3/check提交结果tokendatacb…返回 result + validate

image-20260816104240379

PixPin_2026-08-16_10-49-11

get 请求参数(浏览器原样抓的)

PixPin_2026-08-16_10-41-37

referer=https://passport.kanxue.com/user-account_login.htm
zoneId=CN31          # getconf 下发
dt=...               # getconf 下发
acToken=             # 本 captchaId 为空
id=e019d55cf18348519c201a0d2f80ebfb
fp=...               # 指纹,见 3.1
https=true
type=                # 空 = 默认滑块
version=2.28.5
dpr=1
dev=3                # 设备类型
cb=...               # 随机串加密,见 3.2
ipv6=false
runEnv=10
group= scene=
lang=zh-CN
sdkVersion=
loadVersion=2.5.4
iv=4                 # IV_VERSION,core 常量
user=
width=320
audio=false
sizeType=10
smsVersion=v3
token=               # 刷新时带上旧 token
callback=__JSONP_xxx_0

check 请求参数

PixPin_2026-08-16_11-27-18

id, token, dt, zoneId, referer
data={"d":"...","m":"","p":"...","f":"...","ext":"..."}   # 核心
width=320  type=2  version=2.28.5  cb=...  bf=0  runEnv=10  iv=4  loadVersion=2.5.4

data 四个密文字段(m 恒为空),全部由本地生成。


二、解混淆:两层字符串表

core 六百多 KB,字符串全部收进一张表,调用统一走 a0_0x1e60(0x..)

var a0_0x3d6e=['doIJY3r0CJ','bDgVsRFVwz8', ...共1545条];
function a0_0x1e60(_0x3d6ee5,_0x1e6084){
  // 自定义 base64 字母表: kyclmxfigrhbswquanzevpjotdKYCLMXFIGRHBSWQUANZEVPJOTD0123456789+/=
  // 解码: 自定义base64 -> %xx -> decodeURIComponent
}

注意:不是标准 base64,字母表是自定义的。解码器自带 gtHdNm 方法,内部做了缓存。

更坑的是:解完这层,最底下的大模块还有第二层——自己的数组、自己的解码器,字母表是 2izvR3Ydkgw605lf(16 字符,映射到 hex)。

PixPin_2026-08-16_11-28-37

解混淆不硬啃,三步:

  1. 把数组 + 解码器原样抠出来,丢 Node vm 里跑,让解码器吐出全表
  2. 正则把 a0_0x1e60(0x..) 全部替换成明文
  3. 用 Babel 解析整个包,定位 webpack 模块数组,逐个拆出,共 77 个模块

三、参数逐个还原

3.1 fp

getfp 是浏览器指纹。全局搜 gdxidpyhxde 只找到一处读取,没有写入——因为生成它的模块把字符串名也编进了自己的嵌套表。

实际链路:

  • cookie 里存 gdxidpyhxdE
  • window.gdxidpyhxde 由 cookie 解码而来
  • 格式:自定义base64密文:时间戳,如 VppCnhP7SV+Y\pbQCE8...:1786798405363

PixPin_2026-08-16_11-29-34

处理:把生成模块原样塞进 Node vm,补假的 window/document/navigator/localStorage/screen,跑完 window.gdxidpyhxde 就有值了,与浏览器一致。整个指纹生成器不用自己复刻。

PixPin_2026-08-16_11-29-46

3.2 cb

cb 是每次请求都会变的随机串:

uuid = 32 位随机 [0-9A-Za-z]
在位置 [1, 10, 12, 13, 26, 31] 依次注入 "vfnv46" 六个字符
cb = aes(uuid)

suffixcodepos 三个常量(m25b40 / vfnv46 / 位置数组)与版本绑定,换版本要重取。

3.3 自研 aes

这个 aes 不是 AES,是易盾自己搓的分组密码。常量:

常量
SEED_KEYfd6a43ae25f74398b61c03c83be37449
ROUND_KEY037606da0296055c
SBOX256 字节置换表(__SBOX__
私有 base64 字母表MB.CfHUzEeJpsuGkgNwhqiSaI4Fd9L6jYKZAxn1/Vml0c5rbXRP+8tD3QTO2vWyo
填充符7

加密流程:

  1. 明文 UTF-8 字节 + CRC32(8 字节 hex)
  2. 按 64 字节分块,末尾补零 + 4 字节长度
  3. 密钥:SEED_KEY 扩到 64 字节,异或 4 字节随机数,再扩回 64 字节
  4. 每块做轮函数:ROUND_KEY 每 2 字节一组(操作码 + 操作数),对块做异或/加法,共 4 轮
  5. 链式:块^密钥 → 加prev → 异或prev → S盒(S盒()),输出即下一轮 prev
  6. 结果前 4 字节放随机数,最后私有 base64 编码

轮函数操作表(ROUND_KEY = 03 76 06 da 02 96 05 5c):

操作码操作
0不变
1全块异或常量
2全块加常量
3逐字节异或递增
4逐字节加递增
5逐字节异或递减
6逐字节加递减

逆运算(验证用):S 盒求逆 + 反向轮函数 + 反向链,CRC 校验通过即还原成功。后面解密真实样本全靠它。

3.4 dt / iv

  • dt:getconf 下发,存 localStorage["ujg3ps2znyw"]
  • iv=4:core 常量 IV_VERSION
  • loadVersion=2.5.4:load.min.js 的 VERSION

四、最大卡点:data 全 False

d/m/p/f/ext 按模块逻辑生成后,get 正常(error:0),check 也正常返回 error:0,但 result 恒为 false。p 从 2 扫到 98(步长 2,同一 token 可重复 check)一个都不中

此时能确定:不是位置问题,是数据本身有问题。但密文看不出问题在哪。

破局:在浏览器手动拖一次,抓通过的 check 请求(result:true),用自研 aes 逆运算把 data 全解密。拿到明文后,三个坑当场现形:

坑 1:p 不取整

真实明文:"77.8125"

前端代码是 parseInt(jigsaw.style.left) / width * 100 + '',直接字符串拼接,没有 round。我之前生成的是 Math.round(...),全灭。

坑 2:f 不是原始轨迹

f 的明文是 47 个浮点数,不是 dx,dy,t,trusted 坐标。前端先把轨迹丢进一个统计模块(module_0x38),算出 47 维特征再拼接:

轨迹点 -> [x序列, y序列, t序列]
-> 速度序列(vx, vy, 合速度) -> 加速度序列(ax, ay, a合)
-> 统计: 数量/去重数/均值/标准差/最小/最大/25分位/75分位

真实样本 f 明文开头:

124,17,0.2042,4.776,142,0,0.8333,0.2133,0.1808,38,0.0625,0.3333,-0.3333,...

直接发坐标 = 风控一眼假。

坑 3:xorEncode 参数顺序

xorEncode(a, b) 输出长度由 b 决定:

xorEncode('数据', 'token')  // 错:输出长度 = token 长度
xorEncode('token', '数据')  // 对:输出长度 = 数据长度

写反后密文长度直接不对,服务端自然不认。

PixPin_2026-08-16_11-37-43

PixPin_2026-08-16_11-38-32

经验:加密参数还原后,必须用真实通过样本对账。 猜出来的逻辑,错在哪个细节根本看不出来。


五、轨迹与 data 生成

真实通过样本透露的轨迹参数:

ext = "2,142"     # mouseDown 次数=2,轨迹点数=142
d   = 50 个采样点  # SAMPLE_NUM=50,等间隔采样
点格式: "dx,dy,t,1"   # 最后一位 trusted=1(真实鼠标)
最后一点: "260,3,1716,1"   # 拖动 260px,耗时 1716ms

对应关系:jigsawLeft=249 时,dragX=260,差值 10.5 来自 restrict() 映射(见第六节)。

生成逻辑(核心代码):

function genTrace(dragX, token) {
  // 140 点 / 1750ms / ease-out / trusted=1
  for (let i = 0; i < 140; i++) {
    const t = Math.round(1750 * i / 139);
    const dx = Math.max(0, Math.round(dragX * (1 - Math.pow(1 - i/139, 3))));
    const dy = Math.round((Math.random() - 0.5) * 6);
    atomTrace.push([dx, dy, t, 1]);
    traceData.push(xorEncode(token, [dx, dy, t, 1].join(',')));
  }
}

function buildData({ token, jigsawLeft, traceData, atomTrace }) {
  const d   = aes(sample(traceData, 50).join(':'));          // 50 采样
  const p   = aes(xorEncode(token, String(jigsawLeft / 320 * 100))); // 不取整
  const f   = aes(xorEncode(token, features(uniqueByTime(atomTrace)).join(','))); // 47 维
  const ext = aes(xorEncode(token, '2,' + traceData.length));
  return JSON.stringify({ d, m: '', p, f, ext });
}

check 通过后拿到服务端 validate,还要再算一次才是给业务方的最终值:

finalValidate = zoneId + '_' + md5(aes(validate + '::' + fp)) + '_v_i_1'
// 例: CN31_90fffa737f70291f7a08893899dc5d3c_v_i_1

六、缺口检测

一开始用拼图小块对背景做模板匹配,匹配到一个无关角落。原因:背景的缺口是被抠空的,拿拼图去匹配空腔,必然失败。

正确做法:拼图 alpha 轮廓 vs 背景 Canny 边缘

mask   = alpha > 0                          # 拼图不透明区域
dist   = distanceTransform(mask)            # 取轮廓(距边界 ≤2px)
outline = (dist <= 2) & (dist > 0)
edges  = Canny(bg)
res    = matchTemplate(edges, outline, TM_CCOEFF_NORMED)
# 取 y 在拼图 bbox 高度范围内的最优 x

用人工通过的图验证:命中 x=251,真实 jigsawLeft=249,差 1px。

PixPin_2026-08-16_11-39-27

restrict() 映射细节:前端滑块有个 restrict(),拼图位移 ≠ 鼠标位移:

jigsawLeft = dragX - 10.5        # 常规区间
jigsawLeft = dragX / 2           # 拖前 21px 内

所以想落到 jigsawLeft=249,鼠标要拖 259.5;轨迹终点的 dx 也必须用 dragX,不是 jigsawLeft


七、结果

验证:

  • check 连续 5/5 result:true
  • 最终 validate 提交看雪 /user-kanxue_login.htm,返回 帐号或密码错误(假账号下即验证码已过)

PixPin_2026-08-16_11-40-15

PixPin_2026-08-16_11-40-33

 你们的UID都是多少?
#16 · 爷
发帖 2026-08-12 09:12:58 · 快照 2026-08-12 10:15:21

692

隔壁疑似在网页注入攻击提示词
#1 · 爷
发帖 2026-08-10 23:57:31 · 快照 2026-08-12 10:29:24

2年前的东西也搬

来看看爷写的调节显示器亮度软件精华
#7 · 爷
发帖 2026-08-09 22:40:57 · 快照 2026-08-12 10:46:34

@嘿嘿喵喵 #3 只有win的。mac接口也不一样。没法通用。

来看看爷写的调节显示器亮度软件精华
#6 · 爷
发帖 2026-08-09 22:40:34 · 快照 2026-08-12 10:46:34

@steve02081504 #2 这咋可能,没感光元件

来看看爷写的调节显示器亮度软件精华
#5 · 爷
发帖 2026-08-09 22:40:17 · 快照 2026-08-12 10:46:34

@杀 #4 你用过外接显示器吗

来看看爷写的调节显示器亮度软件精华
#1 · 爷
发帖 2026-08-09 19:22:51 · 快照 2026-08-12 10:46:34

路过的大哥大姐支持一下

来看看爷写的调节显示器亮度软件精华
#0 · 爷
发帖 2026-08-09 19:11:10 · 快照 2026-08-16 18:34:41

昨天分享了一下酷安的签名纯算。今天分享一下用了很久的win系统亮度调节软件。
大家之前都应该用过Tray,但是一个亮度调节用electron写,有时候会吃上百mb内存,实在太恶心了,而且还会卡来卡去的。
干脆一气之下,自己写了一个,最基本的功能都有,调亮度,快捷键调亮度,用起来是够了。
不想在隔壁开源是因为发个github还要你加上承诺,那我宁愿不发。
————————————————————
Lumaris:轻量,丝滑,有特效
https://github.com/Elnyxn/Lumaris
感兴趣的可以试试看
————————————————————
希望大家多多支持!

最后编辑于 2026-08-11 17:12
是不是机器人注册,没人回复我
#1 · 爷
发帖 2026-08-09 11:52:10 · 快照 2026-08-12 10:53:54

啥意思

喵~关于本SBBot回复的小调整说明~
#1 · 爷
发帖 2026-08-09 11:50:27 · 快照 2026-08-12 10:54:00

@SBBot 锐评一下这个帖子

论坛用的是基于php开发的极简bbs1org论坛架子
#2 · 爷
发帖 2026-08-09 11:48:10 · 快照 2026-08-12 10:54:11

php的牛逼之处😃

开源一下酷安最新版签名纯算
#4 · 爷
发帖 2026-08-09 11:45:13 · 快照 2026-08-12 11:15:37

人多了,顶个帖子。好东西不能埋没啊

唉,好失望,和管理员理性讨论版规被强制撤销用户名
#2 · 爷
发帖 2026-08-08 18:12:30 · 快照 2026-08-12 11:11:15

下一个linuxsb.sb 站倒计时

吵来吵去的就闹笑话了
#0 · 爷
发帖 2026-08-08 18:03:46 · 快照 2026-08-12 11:11:12

真想让do站看看论坛也不是只有他一家的话,建议先思考思考怎么管理。你neo论坛起步的时候也没封过这么多人,反动之类的肯定要ban,我们也不搞事。现在这个苗头感觉发展下去,就真变小丑了。

我的账号刚刚被封了,原因是和管理吵架,关于你置顶的站规,我有几个问题,管理员速速回答,笔友们帮我见证精华
#49 · 爷
发帖 2026-08-08 15:35:02 · 快照 2026-08-12 11:14:27

@Adai #50 又加新功能了,还多了个ip地区显示

更新了一下个人简介
#20 · 爷
发帖 2026-08-08 15:33:55 · 快照 2026-08-12 11:14:38

@StellaFortuna林可欣 #19 这种东西小范围享受就可以了

更新了一下个人简介
#18 · 爷
发帖 2026-08-08 15:29:23 · 快照 2026-08-12 11:14:38

猫娘版本的看过了,有没有魅魔和雌小鬼版的可以看

【入驻通知】91Porn 正式入驻 LINUX SB - 社区
#1 · 爷
发帖 2026-08-08 14:26:59 · 快照 2026-08-12 11:15:03

恭喜,夏阁艾迪剑

即日起免費為LINUX.SB 的逼友發放十萬美刀。
#1 · 爷
发帖 2026-08-08 14:17:06 · 快照 2026-08-12 11:15:12

在哪领😄

给站长支点招
#0 · 爷
发帖 2026-08-08 14:10:34 · 快照 2026-08-12 11:15:20

让ai找点开源的屏蔽词库加到用户名里,然后已经注册的用户,让ai去数据库扫出来,官方账号之类的如果不允许昵称自动改成随机的,然后加入屏蔽词里。这样比人工禁言速度快多了。

新到岗的锦衣卫杀疯了!!赶紧去改名!!
#2 · 爷
发帖 2026-08-08 14:07:51 · 快照 2026-08-12 11:15:29

公告提前说好哪些不允许。我咋还看见吕布也被封了。笑死了

你们的皇帝回来了
#4 · 爷
发帖 2026-08-08 14:06:50 · 快照 2026-08-12 11:15:31

@test1145 #3 6666,秽土转生

有人喜欢孙笑川吗
#1 · 爷
发帖 2026-08-08 14:04:02 · 快照 2026-08-12 11:15:32

楼主喜欢

你们的皇帝回来了
#2 · 爷
发帖 2026-08-08 14:03:44 · 快照 2026-08-12 11:15:31

夏阁艾迪剑

所以我刚刚为什么被禁言了
#2 · 爷
发帖 2026-08-08 13:59:54 · 快照 2026-08-12 11:15:34

在错误的地方

今天再做一个抽奖功能 其他的需求先等等
#5 · 爷
发帖 2026-08-08 13:58:38 · 快照 2026-08-12 11:15:47

慢慢来吧,问题不大

有人喜欢xnn吗
#2 · 爷
发帖 2026-08-08 13:58:10 · 快照 2026-08-12 11:15:35

@fucker #1 小南娘001

开源一下酷安最新版签名纯算
#2 · 爷
发帖 2026-08-08 13:57:35 · 快照 2026-08-12 11:15:37

@夏天 #1 那必须不错

开源一下酷安最新版签名纯算
#0 · 爷
发帖 2026-08-08 13:55:07 · 快照 2026-08-12 11:15:37

本站第一个逆向贴。
网易易盾的壳也是轻松dump。
啥时候支持md代码块啊
#!/usr/bin/env python3
"""Coolapk 16.x X-App-Token generator.

The algorithm was verified against libauth.so (version 16.5.1).
"""

import base64
import hashlib
import time

try:
import crypt
except ImportError as exc: # Python 3.13+ needs a libcrypt-compatible package.
raise RuntimeError("Python crypt module is required for bcrypt ($2y$)") from exc

PACKAGE_NAME = "com.coolapk.market"
VERSION_CODE = 2607271

Encrypted constant copied from libauth.so's getToken() data path.

_AUTH_BLOB_B64 = (
"Dg4YDxUcCykLah82Fg8XMQ0eHzALCR8pDyMfNxYeFBsPI2seChwDLxMjajMXDxdvEyAYDxAcOS4XIzEyFw8LaxAJax4VCQ8iFyAy"
"CxYMFy0MamopEyMyCRcOCykNDhweCBwfLQtqCAwXCQsxDwlqMBEJFy4QHjIDFgwLMQ8wHyARCQspF2oYDBYOCy0PM2pqFAkXKRdo"
"GAIWDBc2EBlrHhQcNhQWGQtqDQ4fIBYJCyILah8yFh8XNhMwHyARHDktFyBqNhYzFB8MIB8wCgkDLxQeMTEWHBctDDMiDhEcMS4L"
"IDICFhwXKQ0ZbjAWCQMuD2gYDg4OG2oWHB8vFyAyDhYwFzITMBweFxwXKRNqGAwWGQsxDxktIBAJEykTIBgJFx8XYg8ZIh8WCRMu"
"E2gYCxYPCzUPI2owFhwXKRMjDzEXHAstDDFqLggZIgMXDhc2EBluahQJHy0PaggLFhwXMhMzajEUCRctD2gYCxYwFD0PIy0wFRwfKRQZ"
"Ig4WHxctDRkiDxYJHy4TIwgOFh4UGBMjamoQHAAUFw8XKQ8eGB8QHD0uFBlqMRYeCzENGWseFxwXIggZMTAWDBdqDDMiDhcc"
"PSITI2o3FgwXIhAJaiAQHAsiF2gYCxYJC24NDhgeFxwXLxNqDzIOCS0gChw9LggeGAgXHhQfDwlqMBUcAy8QHjE2FwkLag8gGyAU"
"CRctCB4xMRcOFzEMCSIPFxwLLggZIgMXDhQcEyMiHxYcAykTIA8yFjMLagxqaiIUGSIMFhkXagwjbiAQHA8iFBkiDhYcC24MI24w"
"AxwDIhAeDzAWDxctDyAcHgocEykXah82Fh4XKQweG2oVCRcvFBkxNxYfCzEMMyIfFwkQFBYOFzUPMy0gFhw5Lg9qCAsWMwstDA4c"
"HhAJDy0PIzEwFw8XMhMjaiATCQ8pE2ofMBcOFy0PCWsPFBw5IggeHzYWDwsuEAluMRQcEykTIDIADg4YDgMcHy0LIwgDFgkXNhMJ"
"bmoWHD0pDB4IABYPCzUNDhgeCxwDLggZIg0WMBQfDB4YHhccMS4UHg82FhwLbgwJaw8QHD0tFyAIDRYeC24PD2otCyNqNxYPC24N"
"CWsOFwkXKQ8jDzMXDxQbDwkiDxYcAy8TaggPFjMXKQ0eHB8WHBciE2gYCxYMF2oNCW4xFRw5LRdqCAIWDBc1DRlqMBEcHyIWGRdq"
"DDMiDhQcGy4IHggNFg8LNhAZaw4QHBstFBkiPQMb"
)

def _md5(data: bytes) -> str:
return hashlib.md5(data).hexdigest()

def build_device_id(metadata: str, manufacturer: str, brand: str, model: str,
display: str, oaid: str) -> str:
"""Reproduce C9682.m64375()'s X-App-Device value."""
raw = f"{metadata}; ; ; ; {manufacturer}; {brand}; {model}; {display}; {oaid}"
encoded = base64.b64encode(raw.encode("utf-8")).decode("ascii")
return encoded[::-1].replace("=", "").replace("\r", "").replace("\n", "")

def _auth_stream() -> bytes:
encrypted = base64.b64decode(_AUTH_BLOB_B64)
return bytes(value ^ 0x5A for value in encrypted)

def get_token(device_id: str, timestamp: int | None = None,
version_code: int = VERSION_CODE,
package_name: str = PACKAGE_NAME) -> str:
"""Generate X-App-Token for the supplied X-App-Device value."""
if timestamp is None:
timestamp = int(time.time())

# libauth selects a 128-character base64 window using current time and version.
stream = _auth_stream()
index = (timestamp + version_code) % 100
start = 0x80 + index * 4
fragment = base64.b64decode(stream[start:start + 0x80])

payload = b"&".join((
package_name.encode("utf-8"),
fragment,
_md5(device_id.encode("utf-8")).encode("ascii"),
str(timestamp).encode("ascii"),
str(version_code).encode("ascii"),
))

encoded_payload = base64.b64encode(payload)
password = _md5(encoded_payload).encode("ascii")
payload_digest = _md5(payload).encode("ascii")

# Native code passes the complete base64 string to bcrypt; crypt uses its
# first 22 characters as the Blowfish salt.
salt = base64.b64encode(f"{timestamp:x}/".encode("ascii") + payload_digest).decode("ascii")
setting = "$2y$04$" + salt[:22]
bcrypt_result = crypt.crypt(password.decode("ascii"), setting)
if not bcrypt_result or bcrypt_result.startswith("*"):
raise RuntimeError("system crypt does not support bcrypt $2y$")

return "v3" + base64.b64encode(bcrypt_result.encode("ascii")).decode("ascii")

if __name__ == "__main__":
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("device_id")
parser.add_argument("--timestamp", type=int)
args = parser.parse_args()
print(get_token(args.device_id, args.timestamp))

改名通道已打开 不和谐的用户名赶紧改
#29 · 爷
发帖 2026-08-08 13:36:59 · 快照 2026-08-12 11:16:49

单字极品id

搞半天大家除了下流语言就一点真东西没拿出来吗?
#9 · 爷
发帖 2026-08-07 19:12:24 · 快照 2026-08-18 13:48:14

诞生才几个小时

这终于是我最开放的写一次个人简介了(V1)
#2 · 爷
发帖 2026-08-07 18:51:12 · 快照 2026-08-18 13:14:02

疯了!!

LINUX SB上线 更新的理想型社区
#72 · 爷
发帖 2026-08-07 17:26:59 · 快照 2026-08-15 02:53:49

啥时候接入一下快捷登录