不安全的随机性¶
ID: java/insecure-randomness
Kind: path-problem
Security severity: 7.8
Severity: warning
Precision: high
Tags:
- security
- external/cwe/cwe-330
- external/cwe/cwe-338
Query suites:
- java-code-scanning.qls
- java-security-extended.qls
- java-security-and-quality.qls
如果你使用密码等加密弱伪随机数生成器来生成安全敏感值,攻击者可以更轻松地预测这些值。
伪随机数生成器生成一系列数字,这些数字仅近似随机数的属性。该序列并非真正随机,因为它完全由一组相对较小的初始值(种子)决定。如果随机数生成器在加密上很弱,那么可以通过外部观察轻松预测此序列。
建议¶
java.util.Random
随机数生成器在加密上不安全。改用安全的随机数生成器,例如 java.security.SecureRandom
。
如果输出要在安全敏感的环境中使用,请使用加密安全的伪随机数生成器。一般来说,如果预测值将允许攻击者执行他们原本无法执行的操作,则该值应被视为“安全敏感”。例如,如果攻击者可以预测为新用户生成的随机密码,他们将能够以该新用户身份登录。
示例¶
以下示例显示了使用随机值生成 cookie 的不同方法。
在第一个(错误)情况下,我们通过将随机整数附加到静态字符串的末尾来生成一个新的 cookie。使用的随机数生成器 (Random
) 在加密上不安全,因此攻击者有可能预测生成的 cookie。
Random r = new Random();
byte[] bytes = new byte[16];
r.nextBytes(bytes);
String cookieValue = encode(bytes);
Cookie cookie = new Cookie("name", cookieValue);
response.addCookie(cookie);
在第二个(GOOD)案例中,我们通过在静态字符串末尾附加一个随机整数来生成一个新 Cookie。所使用的随机数生成器 (SecureRandom
) 是经过加密保护的,因此攻击者无法预测生成的 Cookie。
SecureRandom r = new SecureRandom();
byte[] bytes = new byte[16];
r.nextBytes(bytes);
String cookieValue = encode(bytes);
Cookie cookie = new Cookie("name", cookieValue);
response.addCookie(cookie);
参考¶
维基百科:伪随机数生成器。
Java 文档:Random。
Java 文档:SecureRandom。
通用弱点枚举:CWE-330。
通用弱点枚举:CWE-338。