问题类型:安全热点
安全问题级别:MEDIUM
一、问题代码
工具类Package:
Java commons-lang3 库 RandomUtils 随机数工具类
import org.apache.commons.lang3.RandomUtils;
用法:
RandomUtils.nextInt(0, 999999999) //生成 0 - Integer.MAX_VALUE 范围的随机数
Random()有安全隐患,相同的种子生成的结果一样,攻击者可能会猜测到下一个结果。
如果在密码相关领域需要使用SecureRandom(),相同的种子,生成的结果也不一样。
二、风险问题
使用伪随机数发生器(PRNG)是安全敏感的。例如,它在过去导致了以下漏洞:
- CVE-2013-6386
- CVE-2006-3419
- CVE-2008-4102
当软件在需要不可预测性的上下文中生成可预测值时,攻击者可能会猜测将生成的下一个值,并使用此猜测来模拟其他用户或访问敏感信息。
由于java.util.Random类依赖于伪随机数生成器,因此此类和相关的java.lang.Math.Random()方法不应用于安全关键应用程序或保护敏感数据。在这种情况下,应该适当使用java.security.SecureRandom类,该类依赖于加密强随机数生成器(RNG)。
三、如何修复
该问题主要关注随机数的用途是否涉及敏感信息,比如电子钱包、密码、token等。普通的生成随机数字暂可以认为safe。
推荐的安全编码实践
使用“java.security.SecureRandom”之类的加密强随机数生成器(RNG)代替此PRNG。
仅使用生成的随机值一次。
不应公开生成的随机值。如果必须存储它,请确保数据库或文件是安全的。
符合要求的解决方案
SecureRandom random = new SecureRandom(); // Compliant for security-sensitive use cases
byte bytes[] = new byte[20];
random.nextBytes(bytes);