必须使用 securerandom 生成安全口令:其依赖系统熵源,抗预测且不可重现;应调用无参构造、nextbytes() 批量生成字节,再经 base64 url-safe 编码嵌入带时效校验的重置链接。

必须用 SecureRandom,不能用 Random。这是安全口令生成的底线——因为 Random 生成的序列可预测,而 SecureRandom 依赖系统熵源(如 Linux 的 /dev/urandom),抗推测、不可重现,符合密码学强度要求。
选对随机源:SecureRandom 实例化要点
直接使用无参构造是最稳妥的做法:
-
SecureRandom sr = new SecureRandom();—— 自动选用平台默认强算法(如 JDK 在 Linux 上默认用 NativePRNG) - 避免手动设种子:
new SecureRandom(byte[] seed)可能引入弱熵,除非你明确控制高质量种子来源 - JDK 8+ 可考虑
SecureRandom.getInstanceStrong(),它强制返回已知强实现(但可能阻塞,仅在高安全等级场景必要)
生成口令字节:优先用 nextBytes() 方法
不要逐个调用 nextInt() 或 nextLong() 拼字符——这会降低熵密度,且易引入偏差。正确做法是批量生成原始字节:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 申请固定长度字节数组:
byte[] tokenBytes = new byte[32]; - 一次性填充:
sr.nextBytes(tokenBytes); - 这样既高效,又保证每个字节都来自同一高熵源,避免多次调用带来的状态损耗或潜在偏差
编码为 URL 安全字符串
原始字节不能直接用于链接,需编码成文本格式。推荐使用 Base64 URL-safe 编码:
Base64.getUrlEncoder().withoutPadding().encodeToString(tokenBytes)- 它避开
+、/和=,适配 HTTP 查询参数和路径段 - 不带 padding(
withoutPadding())使结果更紧凑,也避免 URL 解码歧义
组合成可分发链接
把编码后的口令嵌入可信域名的查询参数中即可:
- 基础模板:
https://api.example.com/reset?token=abc123... - 注意:链接本身不加密,但口令具备单次性、高熵、短时效特性,应配合服务端校验(如绑定用户ID、设置 15 分钟过期)
- 切勿在日志、监控或前端 JS 中明文暴露完整链接
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










