3、身份认证机制:密码策略、多因素认证、单点登录、生物识别
身份认证,说白了就是证明「你是你」的过程。我做了这么多年安全,见过太多因为认证环节出问题导致的数据泄露。今天咱们就聊聊四种主流的认证方式,以及我在实战中踩过的坑。
3.1 密码策略:老古董但绕不开
密码这东西,又爱又恨。你想想看,从互联网诞生那天起它就在,到现在也没被完全替代。但密码也是最容易被攻破的环节。
我个人的习惯是:密码策略不能一刀切。比如内部管理系统和对外网站,复杂度要求应该不一样。
核心密码策略要点:
- 长度优先:至少12位。别迷信复杂字符组合,长密码比复杂密码更安全
- 禁止常见密码:像"123456"、"password"这种,直接拉黑
- 定期更换:90天换一次,但别太频繁,否则用户会写在便利贴上
- 历史记录:记住最近5次密码,防止用户来回用
我的经验:有一次帮客户做安全审计,发现他们的密码策略要求每30天换一次,结果80%的用户密码都是"Password1"、"Password2"这种递增模式。嗯,这策略等于白设。
密码存储这块,千万别存明文。我建议用bcrypt或Argon2这种慢哈希算法。别用MD5或SHA-1,那玩意儿在GPU面前跟纸糊的一样。
// 密码哈希示例(Node.js)
const bcrypt = require('bcrypt');
const saltRounds = 12;
// 注册时
const hash = await bcrypt.hash(password, saltRounds);
// 登录验证时
const isValid = await bcrypt.compare(inputPassword, storedHash);
3.2 多因素认证:加把锁更安心
光靠密码,风险太高。多因素认证(MFA)就是再加一道防线。我经常跟团队说:密码是「你知道的」,MFA是「你拥有的」或「你本身的」。
常见的MFA方式:
- SMS验证码:方便但容易被SIM卡劫持
- TOTP(基于时间的一次性密码):像Google Authenticator,相对安全
- 硬件密钥:YubiKey这类,物理隔离,安全性最高
- 推送通知:手机弹窗确认,用户体验好
避坑指南:我曾经遇到一个项目,为了用户体验只做了SMS验证码。结果有员工被钓鱼,验证码被截获,整个邮箱被拖走。后来我强制要求至少支持TOTP,高风险操作必须硬件密钥。
实施MFA时,我建议分场景处理:
- 普通登录:密码 + TOTP
- 敏感操作(转账、改密):密码 + 硬件密钥
- 内部系统:强制MFA,没有例外
3.3 单点登录:方便与风险的平衡
单点登录(SSO)说白了就是「一次登录,到处通行」。用户不用记一堆密码,IT部门也好管理。但这里有个问题:SSO一旦被攻破,所有系统都沦陷。
我推荐的做法:
- 使用SAML 2.0或OAuth 2.0协议,别自己造轮子
- SSO提供商要选靠谱的,比如Azure AD、Okta
- 关键系统(财务、核心数据库)建议再加一层MFA
实施要点:
- 会话超时设置:15分钟无操作自动退出
- 设备绑定:限制只能从注册设备登录
- 异常检测:异地登录、频繁失败要告警
我记得有个客户,上了SSO后觉得万事大吉,结果员工的笔记本丢了,所有系统都能直接访问。后来我们加了设备绑定和地理围栏,才算把风险降下来。
3.4 生物识别:方便但别迷信
指纹、人脸、虹膜,这些生物特征确实方便。但你想想看:密码忘了可以重置,指纹被盗了能换吗?不能。
生物识别的正确用法:
- 作为MFA的一部分,别单独使用
- 本地验证,别把生物特征上传到服务器
- 留好备用方案:指纹识别失败时,允许用密码
我的经验:做移动端项目时,我们用了人脸识别。但测试发现,双胞胎能互相解锁。后来我们加了活体检测(要求眨眼、转头),误识率才降到可接受范围。
生物识别的技术选型上:
- 指纹:成本低,但手指湿了、脏了容易失败
- 人脸:体验好,但光线、角度影响大
- 虹膜:精度高,但设备贵,用户接受度低
| 认证方式 | 安全性 | 用户体验 | 实施成本 |
|---|---|---|---|
| 密码 | 低 | 中 | 低 |
| MFA(TOTP) | 高 | 中 | 中 |
| SSO | 中 | 高 | 高 |
| 生物识别 | 中高 | 高 | 中高 |
最后提醒:别把鸡蛋放在一个篮子里。我见过最惨的案例是某公司只用指纹认证,结果HR系统被攻破,所有员工的指纹数据被窃取。嗯,那家公司后来花了半年重建认证体系。
身份认证没有银弹。我的建议是:根据业务场景组合使用。普通用户用密码+MFA,内部员工用SSO+MFA,高安全场景再加生物识别。层层防护,才能把风险降到最低。