身份认证基础:密码策略、多因素认证(MFA)、单点登录(SSO)原理与风险归纳

这一章,我打算跟你聊聊身份认证最基础的三板斧——密码策略、多因素认证、单点登录。说白了,就是看一个系统怎么证明“你是你”。每个东西都很有用,但都有坑。我在项目中见过无数看似安全的结构,最后都是在这几个基础环节上被捅出篓子的。

密码策略:别把它做成“防君子不防小人”

密码策略是大多数企业的第一道门。但我个人习惯,从来不信任所谓的“复杂密码策略”本身。为什么?因为一旦你要求用户必须包含大小写、数字、特殊字符,每90天强制改一次,用户就会开始写“P@ssw0rd1!”贴在显示器上。

你想想看,密码策略的核心原则其实就两条:

  • 密码长度比复杂度更关键——12位以上的纯小写密码,暴力破解难度远超8位混合密码。
  • 复杂性不能制造反效应——不要逼用户写出人能记住但机器10秒就能跑完的“复杂密码”。

这里有一张常见密码策略方案的对比表,你看看就明白差距在哪了:

策略类型典型配置安全强度用户抱怨指数
基础长度策略至少8位,无强制复杂度⭐⭐低
复杂+频繁更换策略大写+小写+数字+特殊字符,90天更换⭐⭐⭐极高
长密码+可接受复杂度策略至少12位,鼓励短语⭐⭐⭐⭐⭐低
无密码策略(通行密钥)基于FIDO2的生物特征/设备绑定⭐⭐⭐⭐⭐几乎没有

我个人特别推荐最后一种。有一次我在客户现场遇到一个奇葩场景——他们密码策略里加了一条“新密码不能与历史5次相似”,结果用户直接写“Password1”“Password2”“Password3”,循环用。这种策略除了折腾人,一点用都没有。我当场就建议他们把策略改成“至少12位长度,允许空格,建议使用句子”,结果半年后数据告诉你,暴力破解尝试的成功率直接降了70%。

避坑指南:我曾经遇到过一个客户,密码策略里开了“账号锁定5次后冻结24小时”。逻辑上没问题对吧?但攻击者只需要对每个用户名试4次弱密码,就能让全公司几百人24小时无法登录——这反而成了一个变相拒绝服务攻击。记住了:密码锁定策略一定要跟IP白名单、异地登录检测结合起来。

多因素认证(MFA):别把“第二因素”做成“第二漏洞”

MFA的概念很好理解:双保险。你有一个密码还不够,再加一个一次性验证码、生物特征或者硬件密钥。但你想想看,MFA真能解决所有问题吗?

就我看到的实际情况,很多MFA方案恰恰是最脆弱的环节。

常见的MFA类型与风险

  • 基于短信(SMS OTP):这个我有惨痛教训。我接诊过一起钓鱼事件:攻击者搭建了假的登录页面,用户输入密码和短信验证码后,攻击者立刻拿真验证码去登录真实系统。说白了,短信验证码只能证明你有个手机号,但这个手机号可能被SIM交换攻击劫持。我建议任何新系统就别用了,真的。
  • 基于时间的一次性密码(TOTP):比短信安全一个档次。但TOTP的种子密钥如果存储在用户手机上,手机一被植入木马,种子就会泄露。有一个项目里,我们强制要求所有TOTP种子必须存储在硬件安全模块里,但后来发现用户嫌麻烦都截图存手机相册了……你懂的。
  • 基于推送通知(Push MFA):看似方便,但“推送疲劳攻击”你知道吗?攻击者连续发送几十次推送,用户烦了就点了“允许”。我见过一个案例,攻击者就是靠这种办法,在凌晨3点到4点之间,连着发了80次推送,用户终于撑不住点了个“接受”。
  • 基于FIDO2硬件密钥:这个是目前我最推荐的方式。它从根本上杜绝了钓鱼——因为密钥签名会绑定登录的域名。即使你输入了密码,你的硬件密钥永远不会把签名泄露给假的网站。
特别注意:MFA不是万能的。我记得有一次,客户上线了MFA后觉得高枕无忧了,结果攻击者直接用中间人攻击(MITM),在代理服务器上同时收取登录凭据和MFA验证码。MFA防的只是“凭据泄露后直接登录”,防不了“攻击者实时代理你的完整会话”。

我个人习惯是:优先使用FIDO2/WebAuthn,其次选TOTP,短信MFA只作为最后备选。同时一定要做MFA合规审计,检查有没有用户选择“记住此设备30天”——这实际上是把MFA降级成了单因子认证。

单点登录(SSO):协议本身没问题,但配置是地狱

SSO的承诺很诱人:一个账号登录所有系统。但在我看来,SSO实际上是把所有的鸡蛋都放在了一个篮子里。一旦这个篮子破了,所有系统的访问权限都完了。

目前最主流的两个协议是SAML(Security Assertion Markup Language)和OIDC(OpenID Connect)。

SAML vs OIDC 简表

对比维度SAMLOIDC
传输层基于XML基于JSON
适用场景企业级应用、Web服务现代Web、移动端、API
签名方式使用X.509证书签名SAML断言使用JWT(JSON Web )签名
典型风险点XML签名包装攻击、断言注入JWT密钥泄露、令牌劫持
用户体验较重,需要服务端集成轻量级,前后端友好

我在渗透测试中经常遇到的一个情况是:服务提供商(SP)没有验证身份提供商(IdP)发来的SAML断言的签名。说白了,攻击者只需要伪造一个SAML断言,就能冒充任意用户登录系统。这个问题我在一次远程银行系统测试中亲眼见到了——我伪造了一个“admin”用户的断言,直接从登录页面跳进去了,甚至不需要密码。

关键提醒:不管是SAML还是OIDC,签名验证和令牌绑定是底线。我建议你在做SSO配置时,一定要反复验证三个点:1)证书是否吊销检查?2)断言中的接收方地址(Recipient/Audience)是否匹配?3)有没有及时拒绝过期的令牌(NotOnOrAfter / exp)?

SSO的主要风险归纳

  • 会话劫持(Session Hijacking):攻击者窃取了SSO令牌后,可以在令牌有效期内访问所有绑定的应用。我见过有些公司把SSO令牌的有效期设成了24小时……这不是SSO,这是给自己开了一扇后门。
  • 单点故障(Single Point of Failure):IdP一旦挂掉,所有业务系统都瘫痪了。我建议一定要做IdP的冗余和回退方案。
  • 配置漏洞(Mass Assignment & Open Redirect):很多SSO实现漏了验证redirect_uri,攻击者可以构造一个链接,把用户的有效令牌发送到恶意站点。这种坑我曾经在测试一个医疗系统时帮他们排查到。

下面这个结构图,我把它画成了本章节的知识体系,你可以快速看看:

身份认证基础风险体系 身份认证基础 密码策略 长度 vs 复杂度 频繁更换陷阱 锁定策略滥用 多因素认证(MFA) SMS 劫持 推送疲劳 种子泄露 单点登录(SSO) 签名绕过 会话劫持 回调URL未验证 综合防护策略 (无密码 / FIDO2 + 短有效期 + 签名验证) 密码、MFA与SSO三者不是孤立的。攻击者通常从最弱的链条入手。 例如:弱密码 + SMS MFA + 未验证SSO断言 = 三颗定时炸弹。

这个图其实表达的是一个很简单的逻辑:身份认证的三个基础组件各自独立,但风险点会串联。一旦其中最脆弱的一环被击穿,整个认证体系就会连锁崩溃。我每次做架构审查时,都会带着这个框架去检查每个环节。

小结一下

密码策略、MFA、SSO——三者缺一不可,但每一个都不是免死金牌。我个人最后的建议就是:做减法比做加法更重要。别什么都往上加,先把基础打扎实。密码要长,MFA要硬绑定,SSO要验证签名。做到这三点,你的认证基础不会太差。