3.3 认证升级:MFA、SSO与无密码


3.3 认证升级:MFA、SSO 与无密码

本节摘要:本节把认证体系从"单把口令锁"升级为多层结构:MFA 的因素类别与强度排序(重点解释为何硬件密钥能抗钓鱼而短信与推送不能)、SSO 收敛口令暴露面的收益与新增单点风险、以及无密码方案的原理与迁移路径。认证升级不是买设备,是改信任模型。

给门加第二把锁

口令回合已经证明:只要认证只依赖一个共享秘密,这个秘密迟早会被猜中、被撞出、被钓走。MFA(多因素认证)的思路是把"一个秘密"改成"秘密 + 实物"的合取:攻击者必须同时拿到两样东西。因素分三类——知识(口令、PIN)、持有(手机、硬件密钥、智能卡)、生物(指纹、人脸)。真正构成"多因素"的是跨类组合,口令加 PIN 仍是两个知识因素,等于没加。

因素强度差别巨大,常见排序自下而上:短信验证码最弱(可被补卡劫持、伪基站截获,且验证码本身可被钓鱼转发);推送确认次之(用户被疲劳轰炸后会顺手批准,真实事件里"深夜连发几十条推送直到机主迷迷糊糊点了允许"的打法屡试不爽);时间型动态口令(TOTP)较好(共享种子存本地,不经过运营商,但六位数字仍可被实时钓鱼页中转);硬件安全密钥与平台通行密钥最强(基于公私钥挑战应答,私钥不离开安全芯片,且认证过程绑定网站真实域名,钓鱼页拿到的响应对真站点无效——这就是"抗钓鱼"的技术根源)。

靶场演示:TOTP 与硬件密钥的最小实现

TOTP 的本地实现有助于理解"时间即因子"(仅演示原理,生产请用成熟库):

# 本地靶场:TOTP 校验的最小原理版 import hmac, hashlib, struct, time def totp(secret: bytes, step: int = 30, digits: int = 6) -> str: counter = int(time.time()) // step msg = struct.pack(">Q", counter) digest = hmac.new(secret, msg, hashlib.sha1).digest() offset = digest[-1] & 0x0F code = struct.unpack(">I", digest[offset:offset+4])[0] & 0x7FFFFFFF return f"{code % (10 ** digits):0{digits}d}" def verify(secret: bytes, code: str, window: int = 1) -> bool: # 允许前后各一个时间窗,抵消时钟微小偏差 for skew in range(-window, window + 1): counter = int(time.time()) // 30 + skew msg = struct.pack(">Q", counter) expect = hmac.new(secret, msg, hashlib.sha1).digest() if hmac.compare_digest(totp_from_digest(expect), code): return True return False

硬件密钥一侧的注册与认证骨架(WebAuthn 语义):

# 本地靶场:WebAuthn 语义骨架(生产用官方库) def begin_register(user): challenge = crypto_random(32) store.save(user, "reg_challenge", challenge, ttl=120) return {"challenge": challenge, "rp": {"id": "lab.local", "name": "靶场"}, "user": {"id": user.id, "name": user.email}} def finish_register(user, credential): # 公钥与凭证标识由客户端安全芯片生成,服务端只存公钥 assert verify_challenge(user, credential.client_data) store.save(user, "webauthn_pubkey", credential.public_key) user.mfa_enabled = True def begin_login(user): challenge = crypto_random(32) # 每次登录新挑战,天然防重放 store.save(user, "login_challenge", challenge, ttl=120) return {"challenge": challenge, "rp_id": "lab.local"}

注意 rp_id(依赖方域名)贯穿注册与登录——它就是上图中"域名绑定"的落点,钓鱼页因为域名不同而永远无法完成验证。

SSO:收敛口令暴露面

SSO 把"每系统一套口令"改成"全公司一套口令、一次登录"。收益直接:口令暴露面从几十个登录框收敛到一个,慢哈希、锁定、MFA 等重防御只需在一处做精;员工少记几十套密码,复用惯性随之瓦解;账号离职即全链路失效。代价同样明确:SSO 本身成了最高价值单点——它一旦失守,身后的所有系统一起沦陷。所以 SSO 的对冲清单必须跟上:登录口部署全套反暴破与反钓鱼措施、管理员强制最高强度因素、会话生命周期严格管控、协议选型认准现代标准(基于挑战应答与令牌签名的成熟方案,避开需要把原始口令交给第三方的老旧委托模式)。

无密码:把共享秘密请出场

无密码认证不是"弱化登录",而是釜底抽薪:服务端只存公钥,用户侧私钥锁在安全芯片或平台凭据管理器里,登录即一次针对特定域名的签名挑战。没有共享秘密,就没有可被拖库的哈希、可被钓鱼的口令、可被撞库的复用。迁移路径建议渐进:先给高危角色启用,再开放全员可选用平台通行密钥,保留口令作后备通道但逐步降权(仅限低敏操作)。生物特征在无密码体系里的正确定位是"解锁本地设备上的私钥",而非直接上传服务端比对的模板——指纹数据不出设备,是设计红线。

⚠️ 常见坑:MFA 上线后忘了堵恢复通道。攻击者正面打不动第二因素,就转攻"忘记 MFA 设备"的自助流程——若恢复流程只要一封邮件就能过,整套 MFA 等于侧门大开。恢复流程的强度必须与主流程同级。

检测与推进策略

认证升级的推进要看数据:MFA 覆盖率(分角色统计,管理员必须到满)、MFA 绕过尝试(恢复流程的异常申请量)、钓鱼抵抗因素的占比(硬件密钥用户比例)。检测上关注"MFA 疲劳轰炸"(短时间内大量推送请求)与"异常时间点的批准",前者自动熔断,后者转人工核实。运维自身也别掉队:特权账号的登录必须走硬件密钥加堡垒机跳板,这条不通,前台再华丽也是纸糊的城墙。

认证升级的终点形态一句话:服务器上没有值得偷的秘密,用户手里没有值得钓的密码。到那天,口令攻击回合的大部分剧本自动作废。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U