身份验证核心原则 关键

验证用户/设备身份的真实性("你是谁?")

  • 实施强密码策略(长度≥12位,包含大小写字母、数字和符号)
  • 对所有关键系统强制启用多因素认证(MFA)
  • 使用强哈希算法存储密码(Argon2、bcrypt)
  • 设置账户锁定机制(5次失败尝试后锁定)
  • 实现安全的会话管理(HTTPS传输,短超时时间)

授权最佳实践 重要

验证用户/设备是否有权限执行操作("你能做什么?")

  • 遵循最小权限原则(仅授予必要权限)
  • 实施基于角色的访问控制(RBAC)
  • 服务间授权使用OAuth 2.0/OpenID Connect
  • 在服务端执行资源级访问控制
  • 敏感操作需要二次授权(重新验证身份)

通用安全措施 必需

保护整个身份验证和授权流程的基础措施

  • 所有通信强制使用HTTPS(启用HSTS)
  • 设计安全的API(使用无状态令牌,独立API密钥)
  • 记录所有关键操作日志(登录、权限变更)
  • 每季度进行安全测试(渗透测试、代码审计)
  • 实施零信任模型(验证所有请求)

认证方法比较

多因素认证 (MFA)

  • 认证器应用:高安全性,推荐使用
  • 硬件密钥:最高安全性,防钓鱼
  • SMS验证:易受SIM劫持,不推荐
  • 邮件验证:安全性低,仅用于低风险场景

访问控制模型

  • RBAC:基于角色,易于管理
  • ABAC:基于属性,更细粒度控制
  • PBAC:基于策略,高度灵活
  • MAC:强制访问控制,高安全环境

令牌管理

  • JWT:无状态,适合分布式系统
  • Opaque Tokens:需后端验证,更安全
  • 短期令牌:15-30分钟有效期
  • 刷新令牌:长期有效但可撤销

安全实施最佳实践

密码存储实现

使用bcrypt安全存储密码的示例代码:

javascript
const bcrypt = require('bcrypt'); const saltRounds = 12; // 密码哈希 async function hashPassword(password) { return await bcrypt.hash(password, saltRounds); } // 密码验证 async function verifyPassword(password, hash) { return await bcrypt.compare(password, hash); } // 使用示例 const userPassword = 'SecurePassw0rd!'; const hashed = await hashPassword(userPassword); // 存储 hashed 到数据库 // 验证登录 const isValid = await verifyPassword('inputPassword', hashed);

权限验证模式

资源级访问控制的中间件实现:

javascript
// 资源权限验证中间件 function resourceAuth(resourceType) { return async (req, res, next) => { const resourceId = req.params.id; const userId = req.user.id; try { // 检查用户是否有权访问该资源 const hasAccess = await checkResourceAccess( userId, resourceId, resourceType, req.method // 请求方法 (GET, POST, PUT, DELETE) ); if (!hasAccess) { return res.status(403).json({ error: '无权访问此资源' }); } next(); } catch (error) { res.status(500).json({ error: '服务器错误' }); } }; } // 使用示例 - 保护用户资源 router.get('/users/:id', authMiddleware, resourceAuth('USER'), getUserController );

威胁与防御矩阵

高风险威胁

  • 凭证泄露:使用MFA和定期凭证轮换
  • 会话劫持:HTTP Only + Secure Cookie
  • 权限提升:服务端资源级验证
  • 暴力破解:登录限速和账户锁定

中风险威胁

  • CSRF攻击:Anti-CSRF Token + SameSite Cookie
  • XSS攻击:输入验证和输出编码
  • 配置错误:定期安全审计
  • 令牌泄露:短有效期 + 绑定设备/IP

低风险威胁

  • 用户枚举:统一错误消息
  • 信息泄露:最小化返回数据
  • 弱密码:强密码策略
  • 过期会话:短超时时间

关键安全原则

零信任原则

永远不要信任,始终验证。即使在内网环境中,也要验证所有请求的身份和权限。

最小权限原则

用户和服务只应拥有完成工作所必需的最小权限。定期审查和撤销不必要的权限。

服务端验证

永远不要信任客户端传递的权限标识。所有权限验证必须在服务端执行。