大家好,阿拉乌萨奇。
今天正式发布 Zero-Trust-Lite v0.1.7 🎉
本次版本引入了一项关键安全能力升级,标志着 ZTL 从传统 OTP 机制正式迈入 主动防御(Active Defense)认证模型。
🚀 重点更新
🔐 COTP —— 一次性挑战密码(Challenge-based One-Time Password)
- 协议仓库: 👉 COTP Protocol
- ZTL 集成说明(中文): 👉 COTP In Zero-Trust-Lite_CN
COTP 是一种基于 Challenge–Response 的一次性认证算法,用于解决传统 TOTP 在 实时钓鱼、中间人代理(MITM) 场景下的根本性缺陷。
🌐 公共 COTP 计算器
-
在线计算器: 👉 https://cotp.537233.xyz/
-
ipm 专业站用户: 如果你使用的是 ipm 专业站,可直接访问你自己的专属路径:
https://ipm.537233.xyz/yourpath/cotp
核心实现原理
Zero-Trust-Lite 中的 COTP 实现采用 强上下文绑定的 Challenge–Response 模型,确保:
每一次认证尝试都是唯一的、不可复用的、且仅对当前目标主机有效。
认证模型概览
- 服务端生成 随机挑战(Challenge)
- 前端绑定访问上下文(Host)
- 用户基于 Challenge 生成 COTP 响应
- 后端在严格上下文中完成验证
高级防钓鱼机制:Challenge#Host 绑定逻辑
ZTL 在 COTP 验证流程中引入了 主机名绑定机制,显著增强了对以下攻击模型的防护能力:
- 透明钓鱼代理
- 中间人攻击(MITM)
- 实时转发型验证码劫持
📌 前端绑定机制
当用户请求登录挑战时,前端执行以下流程:
-
获取当前访问主机名 前端从浏览器运行环境中读取当前页面的主机名,用于绑定认证上下文:
window.location.host -
构造挑战输入字符串 将服务端返回的随机挑战与目标主机名进行拼接,形成唯一的认证输入:
Challenge#TargetHost -
生成 COTP 响应 用户将生成的
Challenge#TargetHost字符串复制并提交至 COTP 计算器,由其计算并输出最终的 COTP 验证码,用于后续登录验证。
🔍 后端验证流程
当用户提交 8 位 COTP 响应 时,Zero-Trust-Lite 后端会同时校验以下 三个独立维度:
-
随机挑战(Challenge)
-
真实 Host(来自 HTTP
Host头) -
授权 TOKEN
- 在 ZTL 启动时配置
- 每个部署实例唯一
🧨 防钓鱼逻辑说明
-
若用户是在钓鱼网站上生成验证码:
- 前端计算使用的
$Host≠ 真实目标主机
- 前端计算使用的
-
即便验证码格式正确,后端计算结果也 无法匹配
-
验证将被直接拒绝
⚠️ 关键代理配置要求(非常重要)
当 ZTL 部署在 反向代理(如 Nginx) 后方时,必须 转发原始 Host 头:
proxy_set_header Host $host;
❗ 错误的 Host 转发、跨域(CORS)滥用或 Host 重写行为 ❗ 都可能 破坏 COTP 的安全边界
✅ 安全效果总结
COTP 响应 仅在以下条件同时满足时才有效:
- 正确的 Challenge
- 匹配的 目标 Host
- 合法的 实例 TOKEN
任何一个维度不匹配,验证立即失败。
🔒 安全性与约束设计
♻️ 一次性策略(Anti-Replay)
- 挑战在一次验证尝试后立即销毁
- 无论验证成功或失败
- 内存存储:
Challenges
⏱️ 可配置 TTL
- 挑战具有明确的 生存时间(TTL)
- TTL 到期后自动失效
- 防止延迟重放与缓存攻击
