哈希迭代次数不足¶
ID: swift/insufficient-hash-iterations
Kind: path-problem
Security severity: 7.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-916
Query suites:
- swift-code-scanning.qls
- swift-security-extended.qls
- swift-security-and-quality.qls
存储密码的密码哈希是标准的安全实践,但选择正确的哈希方案同样重要。如果攻击者获取了应用程序的哈希密码,密码哈希方案仍应阻止攻击者轻松获取原始明文密码。
好的密码哈希方案需要无法有效完成的计算。迭代次数少的哈希方案可以有效地计算,因此不适合密码哈希。
建议¶
对于密码哈希方案,使用 OWASP 对足够迭代次数的建议(目前,建议至少 120,000 次)。
示例¶
以下示例展示了密码哈希方案初始化的一些情况。在“BAD”情况中,该方案使用不足的迭代次数初始化,容易受到密码破解攻击。在“GOOD”情况中,该方案至少使用 120,000 次迭代初始化,从而保护哈希数据免遭恢复。
func hash() {
// ...
// BAD: Using insufficient (that is, < 120,000) iterations for password hashing
_ = try PKCS5.PBKDF1(password: getRandomArray(), salt: getRandomArray(), iterations: 90000, keyLength: 0)
_ = try PKCS5.PBKDF2(password: getRandomArray(), salt: getRandomArray(), iterations: 90000, keyLength: 0)
// GOOD: Using sufficient (that is, >= 120,000) iterations for password hashing
_ = try PKCS5.PBKDF1(password: getRandomArray(), salt: getRandomArray(), iterations: 120120, keyLength: 0)
_ = try PKCS5.PBKDF2(password: getRandomArray(), salt: getRandomArray(), iterations: 310000, keyLength: 0)
// ...
}