CodeQL 文档

使用静态初始化向量进行加密

ID: java/static-initialization-vector
Kind: path-problem
Security severity: 7.5
Severity: warning
Precision: high
Tags:
   - security
   - external/cwe/cwe-329
   - external/cwe/cwe-1204
Query suites:
   - java-code-scanning.qls
   - java-security-extended.qls
   - java-security-and-quality.qls

点击查看 CodeQL 存储库中的查询

当在 CBC 或 GCM 等特定模式下使用密码时,它需要一个初始化向量 (IV)。在相同的密钥下,IV 应该是唯一的,理想情况下应该是不可预测的。如果在相同的密钥下使用相同的 IV,则相同的明文会生成相同的密文。这可以让攻击者了解是否传输或存储了相同的数据片段,或者帮助攻击者进行字典攻击。

建议

使用由 SecureRandom 生成的随机 IV。

示例

以下示例使用静态 IV 初始化密码,这是不安全的

byte[] iv = new byte[16]; // all zeroes
GCMParameterSpec params = new GCMParameterSpec(128, iv);
Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, key, params);

以下示例使用随机 IV 初始化密码

byte[] iv = new byte[16];
SecureRandom random = SecureRandom.getInstanceStrong();
random.nextBytes(iv);
GCMParameterSpec params = new GCMParameterSpec(128, iv);
Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, key, params);

参考

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