CodeQL 文档

不安全的随机性

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

单击以在 CodeQL 存储库中查看查询

如果你使用密码等加密弱伪随机数生成器来生成安全敏感值,攻击者可以更轻松地预测这些值。

伪随机数生成器生成一系列数字,这些数字仅近似随机数的属性。该序列并非真正随机,因为它完全由一组相对较小的初始值(种子)决定。如果随机数生成器在加密上很弱,那么可以通过外部观察轻松预测此序列。

建议

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);

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私