如何构建模型识别由Base64编码、Unix时间戳、HMAC组成的三段式特征字符串?
三段式特征字符串识别实现方案
这种字符串的结构特征非常明确,优先用规则校验方案即可达到100%的准确率,无需复杂的机器学习模型,实现步骤如下:
1. 结构初筛
用正则表达式快速过滤掉不符合基础格式的字符串,仅保留三个以.分隔的Base64编码段的内容:
- 正则规则:
^[A-Za-z0-9+/=]+\.[A-Za-z0-9+/=]+\.[A-Za-z0-9+/=]+$ - 校验逻辑:匹配不通过直接判定为不符合要求,匹配通过后按
.分割得到三个子串分别校验
2. 第一段校验
第一段是Base64编码的18位随机数,校验逻辑:
- 对第一段做Base64解码,解码失败直接排除(注意要补全Base64末尾的
=补位符,避免合法编码因为没有补位符解码失败) - 解码后得到的字节转换为数值,校验长度是否为18位,不符合则排除
3. 第二段校验
第二段是Base64编码的Unix时间戳,校验逻辑:
- 对第二段做Base64解码,解码失败直接排除
- 解码后得到的数值转换为Unix时间戳,校验是否在合理范围内:比如不能早于1970-01-01(时间戳0),不能晚于当前时间加合理的偏移量(比如预留1年有效期就设置为当前时间+31536000秒),超出范围则排除
4. 第三段校验(可选)
第三段是HMAC值,根据你是否持有生成该字符串的密钥选择是否校验:
- 没有密钥:仅校验解码后的长度是否符合对应哈希算法的输出长度即可(比如SHA256对应的HMAC输出为32字节,SHA1对应20字节,根据你已知的生成规则确定阈值)
- 持有密钥:将前两段原始字符串用
.拼接后,用相同的哈希算法生成HMAC,和第三段解码后的结果做恒等对比,一致则完全匹配
如果你的场景存在规则无法覆盖的变种,需要用机器学习模型的话,实现逻辑如下:
- 特征提取:提取字符串总长度、
.的数量、各段Base64合法字符占比、各段解码后的长度、时间戳合理性分值、字符串信息熵(随机数和HMAC的信息熵远高于普通文本) - 样本准备:收集足够的正样本(符合要求的字符串)和负样本(普通文本、其他格式令牌、随机乱码等)
- 模型训练:用逻辑回归、随机森林等轻量分类模型训练即可,特征区分度很高,无需复杂的深度学习模型
参考Python实现(规则校验版)
import base64 import time import re # 预定义基础正则 TOKEN_PATTERN = re.compile(r'^[A-Za-z0-9+/=]+\.[A-Za-z0-9+/=]+\.[A-Za-z0-9+/=]+$') # 时间戳合理范围:1970-01-01 至 当前时间+1年 MIN_TS = 0 MAX_TS = int(time.time()) + 365 * 24 * 3600 def check_valid_token(token: str) -> bool: # 基础结构校验 if not TOKEN_PATTERN.match(token): return False part1, part2, part3 = token.split('.') # 第一段18位随机数校验 try: # 补全Base64补位符避免解码失败 decoded_p1 = base64.b64decode(part1 + '=' * (-len(part1) % 4)) if len(str(int.from_bytes(decoded_p1, byteorder='big'))) != 18: return False except Exception: return False # 第二段Unix时间戳校验 try: decoded_p2 = base64.b64decode(part2 + '=' * (-len(part2) % 4)) ts = int.from_bytes(decoded_p2, byteorder='big') if not (MIN_TS <= ts <= MAX_TS): return False except Exception: return False # 可选:第三段HMAC校验,持有密钥时启用 # import hmac # import hashlib # SECRET = b'你的HMAC密钥' # try: # decoded_p3 = base64.b64decode(part3 + '=' * (-len(part3) % 4)) # calc_hmac = hmac.new(SECRET, f"{part1}.{part2}".encode(), hashlib.sha256).digest() # if not hmac.compare_digest(calc_hmac, decoded_p3): # return False # except Exception: # return False return True
内容的提问来源于stack exchange,提问作者skrx10
相关产品推荐
相关产品推荐

