Java账号安全流程规范

wen java案例 28

本文目录导读:

Java账号安全流程规范

  1. 核心原则
  2. 用户注册规范
  3. 用户登录规范
  4. 密码与账号恢复
  5. 敏感操作与风控
  6. 服务端防御与编码规范
  7. 数据库设计规范
  8. 最佳实践总结(Checklist)
  9. 工具推荐(Java生态)

这是一个为Java应用设计的账号安全流程规范,该规范涵盖了从注册、登录、会话管理、密码存储到异常监测的完整生命周期。

这份规范适用于Web应用(Spring Boot)、微服务架构以及Android客户端(Java/Kotlin)。


核心原则

  • 最小权限:系统组件只拥有完成其功能所需的最小数据访问权限。
  • 纵深防御:不依赖单一安全措施(如仅靠复杂密码),需要结合HTTPS、验证码、风控等多层防护。
  • 不信任用户输入:所有从客户端(Web/App)传来的数据都视为不可信,必须进行服务端校验。
  • 明文不落地:密码、密钥、Token等敏感信息禁止以明文形式存储在数据库、日志、缓存或配置文件中。

用户注册规范

1 前端校验(提升用户体验)

  • 用户名:3-20位字母/数字/下划线。
  • 密码:强制强度(至少8位,含大写、小写、数字、特殊字符中的3种)。
  • 确认密码:前端比对一致性。
  • 图形验证码/滑块验证:防止自动化注册。

2 服务端校验(安全核心)

  1. 唯一性检查:校验用户名、邮箱、手机号是否已存在,注意大小写不敏感(数据库一律转为小写存储)。
  2. 黑名单过滤:禁止使用常见弱密码、公司名、敏感词汇作为用户名。
  3. 密码存储
    • 严禁:MD5、SHA-1、Base64、可逆加密。
    • 必须:使用BCryptSCryptArgon2,推荐使用Spring Security自带的BCryptPasswordEncoder
    • 盐值:算法内置随机盐,无需手动拼接。
  4. 速率限制:同一IP或设备在1小时内注册请求超过N次,触发限流(如使用Sentinel或Guava RateLimiter)。

用户登录规范

1 认证流程

  1. 传输安全:全站强制HTTPS,防止中间人攻击。
  2. 凭证验证
    • BCryptPasswordEncoder.matches(明文, 密文) 验证密码。
    • 如果连续登录失败(如5次),冻结账号15分钟或增加CAPTCHA验证。
  3. 二次验证(2FA/MFA)
    • 高敏感操作(提现、修改密码、绑定手机)需强制二次验证。
    • 推荐:TOTP(Google Authenticator)、短信验证码、邮件验证码。
  4. 登录成功处理
    • 记录最近登录IP、时间、设备指纹。
    • 清除之前的登录失败计数。
    • 发送登录通知(邮件/短信)。

2 会话管理 (Token/JWT)

  • JWT签发
    • 有效期:Access Token建议15-30分钟,Refresh Token建议7天。
    • Claims:包含用户ID、角色、签发时间、JWT ID(防重放)。
    • 签名:使用非对称加密(RS256/ES256)或强对称密钥(HS256,密钥必须定期轮换)。
  • Token存储
    • Web:存放于HttpOnly + Secure + SameSite=Strict 的Cookie中,防止XSS窃取。
    • App:存放于系统的Keychain(iOS)或EncryptedSharedPreferences / 密钥库(Android)。
    • 禁止:禁止存储于localStorage(易受XSS攻击)或URL参数中。

3 登出规范

  • 服务端:将当前Access Token或用户Session ID加入黑名单/拒绝列表(Redis),直至其自然过期。
  • 客户端:清除本地存储的Token及相关状态。

密码与账号恢复

1 修改密码

  • 流程:验证旧密码 -> 输入新密码 -> 再次输入新密码。
  • 安全:修改成功后,立即清除该用户的所有已签发Token(强制所有设备重新登录)。
  • 通知:发送账户变更通知。

2 忘记密码

  1. 用户输入注册邮箱/手机号。
  2. 验证身份(强验证):发送一次性重置链接6位随机码
    • 链接/码有效期:严格限制在15分钟内
    • 链接需包含不可猜测的token(UUID + 签名),禁止仅使用用户ID。
    • 使用过后立即失效。
  3. 强制:重置密码后,不得自动登录,要求用户重新输入新密码登录。
  4. 拒绝枚举:无论邮箱/手机号是否存在,返回统一的提示信息(如:“如果该账户存在,您将收到重置邮件”)。

3 账号锁定策略

  • 临时锁定:连续失败N次,锁定M分钟。
  • 永久锁定:涉嫌被盗、违反服务条款等由管理员操作。
  • 解锁方式:通过绑定的手机/邮箱进行自助验证解锁,或联系客服。

敏感操作与风控

在以下操作时,除了标准Token校验,需增加风险控制二次验证

操作类型 风控检测项 二次验证手段
登录 异地登录、新设备、异常时间段 短信/邮箱验证码、MFA
转账/支付 大额、频繁、向新账户转 支付密码 + OTP / 生物识别
修改安全设置 修改密码、解绑手机/邮箱、修改密保 需要原手机/邮箱确认或MFA
查看敏感信息 查看全部手机号、身份证号 支付密码或临时Token

风控措施(Java实现建议)

  • 位置校验:对比当前登录IP的地理位置与历史记录。
  • 设备指纹:生成唯一设备ID,检测是否在陌生设备上操作。
  • 行为分析:启动一个异步任务(如CompletableFuture),将用户行为日志发送到流处理平台(Flink/Spark)进行实时评分。

服务端防御与编码规范

1 常见攻击防御

攻击类型 Java防御策略
暴力破解 登录/接口限流(AOP + Redis + Lua脚本实现滑动窗口)。
SQL注入 禁用字符串拼接SQL;使用MyBatis-Plus或JPA的预编译传参。
XSS 前端框架(React/Vue)自带转义;后端使用Jsoup过滤富文本;Spring响应头设置 X-XSS-Protection: 1; mode=block
CSRF 使用Spring Security默认开启的CSRF保护;前后端分离使用 SameSite=Strict 的Cookie。
会话固定 用户登录成功后,调用 session.invalidate() 或生成新的Session ID(Spring Security默认已做)。

2 日志与审计

  • 禁止:禁止在日志中打印 passwordtokenauth_code 等字段(使用logbackreplace转换器过滤)。
  • 必须:记录所有鉴权失败、权限变更、敏感数据访问的审计日志。
    • 字段:user_id, action, ip, user_agent, timestamp, result(success/fail)

3 依赖安全

  • 定期扫描依赖(Maven/Gradle插件 owasp dependency-check)。
  • 及时升级Spring Boot、Tomcat、Jackson等高危组件版本。

数据库设计规范

-- 用户表 (users)
CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL, -- BCrypt密文
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(20) UNIQUE,
    mfa_secret VARCHAR(100) DEFAULT NULL, -- TOTP密钥 (加密存储)
    account_locked BOOLEAN DEFAULT FALSE,
    enabled BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 登录失败记录表 (login_attempts) - 用于限流
CREATE TABLE login_attempts (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT,
    ip_address VARCHAR(45),
    attempt_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- (建议: 使用Redis替代MySQL存储失败计数,性能更高)

最佳实践总结(Checklist)

  1. [x] 密码使用BCrypt/Argon2加密。
  2. [x] 所有非公开接口强制Bearer Token或Session验证。
  3. [x] Token设置合理的过期时间,并支持刷新和撤销。
  4. [x] 重要操作启用MFA二次验证。
  5. [x] 登录失败有熔断/限流机制。
  6. [x] 全站开启HTTPS,Cookie设置HTTP Only + Secure。
  7. [x] 无明文密码泄露(日志、数据库、返回体)。
  8. [x] 修改密码/重置密码后,强制失效所有旧会话。
  9. [x] 依赖库定期更新,无高危CVE漏洞。

工具推荐(Java生态)

  • 认证框架:Spring Security, Apache Shiro, Sa-Token。
  • 密码加密:Spring Security Crypto (Bouncy Castle Provider)。
  • JWT库:io.jsonwebtoken (jjwt), auth0/java-jwt, nimbus-jose-jwt。
  • 验证码:EasyCaptcha, Google reCAPTCHA (集成Spring Boot Starter)。
  • 限流:Guava RateLimiter (单机), Redis + Lua (分布式), Sentinel。

这份规范可以作为你开发Java安全模块时的SOP或Code Review的检查依据,根据具体业务场景(如高并发、金融合规等)可以再适当增加脱敏和加密规则。

抱歉,评论功能暂时关闭!