加密静态初始化向量¶
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
当密码在某些模式(例如 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)
// ...
}
参考资料¶
维基百科:初始化向量。
美国国家标准与技术研究院:块密码操作模式建议。
美国国家标准与技术研究院:FIPS 140-2:密码模块安全要求。
通用弱点枚举:CWE-329。
通用弱点枚举:CWE-1204。