You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算Radius Access Accept消息的Authenticator?附排查与实现方法

RADIUS Access Accept 消息 Authenticator 校验方案

手动计算步骤(遵循RFC2865)

  • 提取核心数据
    从抓包结果中获取:

    • Access Request报文中的16字节Request Authenticator
    • Access Accept报文的完整原始字节流
    • RADIUS服务器与客户端共享的Secret密钥
  • 构造哈希输入串
    按以下顺序拼接所有内容(均为字节形式):

    1. Access Accept的报文代码(固定为0x02,即1字节)
    2. Access Accept的报文长度(2字节,大端序,直接取自抓包的报文首部)
    3. 报文标识符(1字节,必须与对应Access Request的标识符一致)
    4. 从Access Request中获取的Request Authenticator(16字节)
    5. Access Accept报文中的所有属性字段(从第20字节开始到报文末尾,保持原始顺序)
    6. 共享的Secret密钥(转成字节流,通常用UTF-8编码)
  • 计算MD5哈希
    对上述拼接后的字节串计算MD5哈希,得到的16字节结果就是标准的Response Authenticator,将其与Access Accept报文中第4-20字节的Authenticator值对比。

Python 校验脚本

import hashlib

def compute_radius_response_auth(request_auth, accept_packet, secret):
    # 拆分Access Accept报文首部
    code = accept_packet[0:1]
    pkt_length = accept_packet[1:3]
    pkt_id = accept_packet[3:4]
    # 提取属性部分(跳过首部20字节)
    attributes = accept_packet[20:]
    
    # 按RFC2865规则拼接哈希输入
    hash_input = code + pkt_length + pkt_id + request_auth + attributes + secret.encode('utf-8')
    # 计算MD5哈希得到Response Authenticator
    return hashlib.md5(hash_input).digest()

# 示例使用(替换为实际数据)
if __name__ == "__main__":
    # 从Access Request抓包中提取的Request Authenticator(bytes类型)
    req_auth = b'\x12\x34\x56\x78\x90\xab\xcd\xef\x12\x34\x56\x78\x90\xab\xcd\xef'
    # 抓包得到的完整Access Accept报文(bytes类型)
    accept_pkt = b'\x02\x00\x38\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x06\x00\x00\x00\x00\x0f\x06\x00\x00\x00\x00\x1a\x06\x00\x00\x00\x00\x1f\x06\x00\x00\x00\x00'
    # RADIUS共享密钥
    shared_secret = "your_radius_secret_here"

    computed_auth = compute_radius_response_auth(req_auth, accept_pkt, shared_secret)
    # 提取服务器返回的Response Authenticator
    server_auth = accept_pkt[4:20]

    print(f"计算值: {computed_auth.hex()}")
    print(f"服务器返回值: {server_auth.hex()}")
    print(f"校验结果: {'匹配' if computed_auth == server_auth else '不匹配'}")

常见问题排查

  • 确保抓包工具捕获的是完整报文,没有截断属性字段
  • Secret密钥必须完全匹配,注意特殊字符的编码(避免用ASCII编码非ASCII字符)
  • 报文长度字段必须使用抓包得到的原始值,不能手动计算(RFC要求用实际报文长度)
  • 标识符必须与对应Access Request的标识符一致,否则计算必然失败

内容的提问来源于stack exchange,提问作者Praveen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:28:17