本文目录导读:

这是一个为Java应用设计的账号安全流程规范,该规范涵盖了从注册、登录、会话管理、密码存储到异常监测的完整生命周期。
这份规范适用于Web应用(Spring Boot)、微服务架构以及Android客户端(Java/Kotlin)。
核心原则
- 最小权限:系统组件只拥有完成其功能所需的最小数据访问权限。
- 纵深防御:不依赖单一安全措施(如仅靠复杂密码),需要结合HTTPS、验证码、风控等多层防护。
- 不信任用户输入:所有从客户端(Web/App)传来的数据都视为不可信,必须进行服务端校验。
- 明文不落地:密码、密钥、Token等敏感信息禁止以明文形式存储在数据库、日志、缓存或配置文件中。
用户注册规范
1 前端校验(提升用户体验)
- 用户名:3-20位字母/数字/下划线。
- 密码:强制强度(至少8位,含大写、小写、数字、特殊字符中的3种)。
- 确认密码:前端比对一致性。
- 图形验证码/滑块验证:防止自动化注册。
2 服务端校验(安全核心)
- 唯一性检查:校验用户名、邮箱、手机号是否已存在,注意大小写不敏感(数据库一律转为小写存储)。
- 黑名单过滤:禁止使用常见弱密码、公司名、敏感词汇作为用户名。
- 密码存储:
- 严禁:MD5、SHA-1、Base64、可逆加密。
- 必须:使用BCrypt、SCrypt或Argon2,推荐使用Spring Security自带的
BCryptPasswordEncoder。 - 盐值:算法内置随机盐,无需手动拼接。
- 速率限制:同一IP或设备在1小时内注册请求超过N次,触发限流(如使用Sentinel或Guava RateLimiter)。
用户登录规范
1 认证流程
- 传输安全:全站强制HTTPS,防止中间人攻击。
- 凭证验证:
BCryptPasswordEncoder.matches(明文, 密文)验证密码。- 如果连续登录失败(如5次),冻结账号15分钟或增加CAPTCHA验证。
- 二次验证(2FA/MFA):
- 高敏感操作(提现、修改密码、绑定手机)需强制二次验证。
- 推荐:TOTP(Google Authenticator)、短信验证码、邮件验证码。
- 登录成功处理:
- 记录最近登录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参数中。
- Web:存放于
3 登出规范
- 服务端:将当前Access Token或用户Session ID加入黑名单/拒绝列表(Redis),直至其自然过期。
- 客户端:清除本地存储的Token及相关状态。
密码与账号恢复
1 修改密码
- 流程:验证旧密码 -> 输入新密码 -> 再次输入新密码。
- 安全:修改成功后,立即清除该用户的所有已签发Token(强制所有设备重新登录)。
- 通知:发送账户变更通知。
2 忘记密码
- 用户输入注册邮箱/手机号。
- 验证身份(强验证):发送一次性重置链接或6位随机码。
- 链接/码有效期:严格限制在15分钟内。
- 链接需包含不可猜测的
token(UUID + 签名),禁止仅使用用户ID。 - 使用过后立即失效。
- 强制:重置密码后,不得自动登录,要求用户重新输入新密码登录。
- 拒绝枚举:无论邮箱/手机号是否存在,返回统一的提示信息(如:“如果该账户存在,您将收到重置邮件”)。
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 日志与审计
- 禁止:禁止在日志中打印
password、token、auth_code等字段(使用logback的replace转换器过滤)。 - 必须:记录所有鉴权失败、权限变更、敏感数据访问的审计日志。
- 字段:
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)
- [x] 密码使用BCrypt/Argon2加密。
- [x] 所有非公开接口强制Bearer Token或Session验证。
- [x] Token设置合理的过期时间,并支持刷新和撤销。
- [x] 重要操作启用MFA二次验证。
- [x] 登录失败有熔断/限流机制。
- [x] 全站开启HTTPS,Cookie设置HTTP Only + Secure。
- [x] 无明文密码泄露(日志、数据库、返回体)。
- [x] 修改密码/重置密码后,强制失效所有旧会话。
- [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的检查依据,根据具体业务场景(如高并发、金融合规等)可以再适当增加脱敏和加密规则。