使用静态初始化向量进行加密¶
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
当在 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);
参考¶
维基百科:初始化向量。
美国国家标准与技术研究院:块密码操作模式的建议。
美国国家标准与技术研究院:FIPS 140-2:密码模块的安全要求。
常见弱点枚举:CWE-329。
常见弱点枚举:CWE-1204。