推荐用 securerandom 生成验证码,因其基于系统熵源、抗预测;字符集应剔除易混淆字符如 0/o/o/1/l/i,示例为 "23456789abcdefghjklmnpqrstuvwxyz"。

Java 中生成随机验证码,推荐用 SecureRandom(安全、防预测),Random 仅适合非安全场景(如测试、内部工具)。关键在于:字符集设计 + 随机索引选取 + 避免可预测性。
选对随机数生成器:SecureRandom 是首选
SecureRandom 基于操作系统熵源(如 /dev/urandom),抗预测、适合验证码等需防暴力枚举的场景;Random 是伪随机,种子易被推断(尤其用 new Random() 时系统时间作种子),不建议用于生产环境验证码。
- ✅ 推荐写法(JDK 7+):
SecureRandom secureRandom = new SecureRandom(); - ⚠️ 不推荐:
Random random = new Random();(尤其在高并发或低熵环境中易重复) - ? 小技巧:可复用同一个
SecureRandom实例(线程安全),无需每次 new
定义字符集:避开易混淆字符更实用
验证码不是越“全”越好。应排除 0/O/o、1/l/I 等视觉相似字符,提升用户识别率和体验。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 常用安全字符集(长度 52):
"ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz"(去掉了 O、o、I、l、0、1) - 若需数字+字母混合(如 4 位):
"23456789ABCDEFGHJKLMNPQRSTUVWXYZ"(共 32 个字符) - 避免使用
UUID.randomUUID().toString()或Math.random()——前者含 '-' 和小写,后者精度低且非加密安全
生成固定长度验证码的简洁实现
核心逻辑:循环 n 次,每次用 secureRandom.nextInt(charset.length()) 取随机索引,拼接字符。
public static String generateCode(int length) {
String charset = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
SecureRandom secureRandom = new SecureRandom();
StringBuilder code = new StringBuilder(length);
for (int i = 0; i
- ✅ 返回如
"K7M9"、"X2FJ"这类清晰、无歧义的字符串 - ? 进阶:可将
SecureRandom提取为 static final 字段,避免重复初始化开销 - ? 别用
random.ints()流式写法生成字符串——在低版本 JDK 中可能触发 Unicode 代理对问题,且不易控制字符集
补充:需要存入 Session 或 Redis 时的注意事项
生成后,务必立即存储(如绑定用户 sessionId),并设置合理过期时间(通常 2–5 分钟)。验证码本身不加密,但传输和存储过程需保障安全:
- 服务端存储建议用带 TTL 的缓存(如 Redis 的
SET key value EX 180) - 前端展示时,避免在 URL 或日志中明文打印验证码
- 校验成功后立即失效(del 或设为空),防止重放
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










