CodeQL 文档

加密静态初始化向量

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

单击查看 CodeQL 代码库中的查询

当密码在某些模式(例如 CBC 或 GCM)下使用时,它需要一个初始化向量 (IV)。在相同的密钥下,IV 应该唯一且理想情况下是不可预测的。如果使用相同的 IV 和相同的密钥,那么相同的明文将导致相同的密文。此行为可能使攻击者能够了解是否传输或存储了相同的数据片段,或帮助攻击者进行字典攻击。

特别是,如果 IV 是硬编码或常量,攻击者只需在字典中查找可能的密钥,然后将这些密钥与硬编码或常量 IV 连接起来,而不是尝试发现整个加密密钥。

建议

使用随机生成的 IV。

示例

以下示例显示了使用各种加密密钥实例化密码的几种情况。在“BAD”情况下,IV 是硬编码或常量,这使得加密数据容易被恢复。在“GOOD”情况下,IV 是随机生成的,而不是硬编码的,这可以保护加密数据免遭恢复。


func encrypt(padding : Padding) {
	// ...

	// BAD: Using static IVs for encryption
	let iv: Array<UInt8> = [0x2a, 0x3a, 0x80, 0x05]
	let ivString = "this is a constant string"
	let key = getRandomKey()
	_ = try AES(key: key, iv: ivString)
	_ = try CBC(iv: iv)

	// GOOD: Using randomly generated IVs for encryption
	let iv = (0..<10).map({ _ in UInt8.random(in: 0...UInt8.max) })
	let ivString = String(cString: iv)
	let key = getRandomKey())
	_ = try AES(key: key, iv: ivString)
	_ = try CBC(iv: iv)

	// ...
}

参考资料

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