身份认证基础:密码策略、多因素认证(MFA)、单点登录(SSO)原理与风险归纳
这一章,我打算跟你聊聊身份认证最基础的三板斧——密码策略、多因素认证、单点登录。说白了,就是看一个系统怎么证明“你是你”。每个东西都很有用,但都有坑。我在项目中见过无数看似安全的结构,最后都是在这几个基础环节上被捅出篓子的。
密码策略:别把它做成“防君子不防小人”
密码策略是大多数企业的第一道门。但我个人习惯,从来不信任所谓的“复杂密码策略”本身。为什么?因为一旦你要求用户必须包含大小写、数字、特殊字符,每90天强制改一次,用户就会开始写“P@ssw0rd1!”贴在显示器上。
你想想看,密码策略的核心原则其实就两条:
- 密码长度比复杂度更关键——12位以上的纯小写密码,暴力破解难度远超8位混合密码。
- 复杂性不能制造反效应——不要逼用户写出人能记住但机器10秒就能跑完的“复杂密码”。
这里有一张常见密码策略方案的对比表,你看看就明白差距在哪了:
| 策略类型 | 典型配置 | 安全强度 | 用户抱怨指数 |
|---|---|---|---|
| 基础长度策略 | 至少8位,无强制复杂度 | ⭐⭐ | 低 |
| 复杂+频繁更换策略 | 大写+小写+数字+特殊字符,90天更换 | ⭐⭐⭐ | 极高 |
| 长密码+可接受复杂度策略 | 至少12位,鼓励短语 | ⭐⭐⭐⭐⭐ | 低 |
| 无密码策略(通行密钥) | 基于FIDO2的生物特征/设备绑定 | ⭐⭐⭐⭐⭐ | 几乎没有 |
我个人特别推荐最后一种。有一次我在客户现场遇到一个奇葩场景——他们密码策略里加了一条“新密码不能与历史5次相似”,结果用户直接写“Password1”“Password2”“Password3”,循环用。这种策略除了折腾人,一点用都没有。我当场就建议他们把策略改成“至少12位长度,允许空格,建议使用句子”,结果半年后数据告诉你,暴力破解尝试的成功率直接降了70%。
多因素认证(MFA):别把“第二因素”做成“第二漏洞”
MFA的概念很好理解:双保险。你有一个密码还不够,再加一个一次性验证码、生物特征或者硬件密钥。但你想想看,MFA真能解决所有问题吗?
就我看到的实际情况,很多MFA方案恰恰是最脆弱的环节。
常见的MFA类型与风险
- 基于短信(SMS OTP):这个我有惨痛教训。我接诊过一起钓鱼事件:攻击者搭建了假的登录页面,用户输入密码和短信验证码后,攻击者立刻拿真验证码去登录真实系统。说白了,短信验证码只能证明你有个手机号,但这个手机号可能被SIM交换攻击劫持。我建议任何新系统就别用了,真的。
- 基于时间的一次性密码(TOTP):比短信安全一个档次。但TOTP的种子密钥如果存储在用户手机上,手机一被植入木马,种子就会泄露。有一个项目里,我们强制要求所有TOTP种子必须存储在硬件安全模块里,但后来发现用户嫌麻烦都截图存手机相册了……你懂的。
- 基于推送通知(Push MFA):看似方便,但“推送疲劳攻击”你知道吗?攻击者连续发送几十次推送,用户烦了就点了“允许”。我见过一个案例,攻击者就是靠这种办法,在凌晨3点到4点之间,连着发了80次推送,用户终于撑不住点了个“接受”。
- 基于FIDO2硬件密钥:这个是目前我最推荐的方式。它从根本上杜绝了钓鱼——因为密钥签名会绑定登录的域名。即使你输入了密码,你的硬件密钥永远不会把签名泄露给假的网站。
我个人习惯是:优先使用FIDO2/WebAuthn,其次选TOTP,短信MFA只作为最后备选。同时一定要做MFA合规审计,检查有没有用户选择“记住此设备30天”——这实际上是把MFA降级成了单因子认证。
单点登录(SSO):协议本身没问题,但配置是地狱
SSO的承诺很诱人:一个账号登录所有系统。但在我看来,SSO实际上是把所有的鸡蛋都放在了一个篮子里。一旦这个篮子破了,所有系统的访问权限都完了。
目前最主流的两个协议是SAML(Security Assertion Markup Language)和OIDC(OpenID Connect)。
SAML vs OIDC 简表
| 对比维度 | SAML | OIDC |
|---|---|---|
| 传输层 | 基于XML | 基于JSON |
| 适用场景 | 企业级应用、Web服务 | 现代Web、移动端、API |
| 签名方式 | 使用X.509证书签名SAML断言 | 使用JWT(JSON Web )签名 |
| 典型风险点 | XML签名包装攻击、断言注入 | JWT密钥泄露、令牌劫持 |
| 用户体验 | 较重,需要服务端集成 | 轻量级,前后端友好 |
我在渗透测试中经常遇到的一个情况是:服务提供商(SP)没有验证身份提供商(IdP)发来的SAML断言的签名。说白了,攻击者只需要伪造一个SAML断言,就能冒充任意用户登录系统。这个问题我在一次远程银行系统测试中亲眼见到了——我伪造了一个“admin”用户的断言,直接从登录页面跳进去了,甚至不需要密码。
SSO的主要风险归纳
- 会话劫持(Session Hijacking):攻击者窃取了SSO令牌后,可以在令牌有效期内访问所有绑定的应用。我见过有些公司把SSO令牌的有效期设成了24小时……这不是SSO,这是给自己开了一扇后门。
- 单点故障(Single Point of Failure):IdP一旦挂掉,所有业务系统都瘫痪了。我建议一定要做IdP的冗余和回退方案。
- 配置漏洞(Mass Assignment & Open Redirect):很多SSO实现漏了验证redirect_uri,攻击者可以构造一个链接,把用户的有效令牌发送到恶意站点。这种坑我曾经在测试一个医疗系统时帮他们排查到。
下面这个结构图,我把它画成了本章节的知识体系,你可以快速看看:
这个图其实表达的是一个很简单的逻辑:身份认证的三个基础组件各自独立,但风险点会串联。一旦其中最脆弱的一环被击穿,整个认证体系就会连锁崩溃。我每次做架构审查时,都会带着这个框架去检查每个环节。
小结一下
密码策略、MFA、SSO——三者缺一不可,但每一个都不是免死金牌。我个人最后的建议就是:做减法比做加法更重要。别什么都往上加,先把基础打扎实。密码要长,MFA要硬绑定,SSO要验证签名。做到这三点,你的认证基础不会太差。