CodeQL 文档

哈希迭代次数不足

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

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

存储密码的密码哈希是标准的安全实践,但选择正确的哈希方案同样重要。如果攻击者获取了应用程序的哈希密码,密码哈希方案仍应阻止攻击者轻松获取原始明文密码。

好的密码哈希方案需要无法有效完成的计算。迭代次数少的哈希方案可以有效地计算,因此不适合密码哈希。

建议

对于密码哈希方案,使用 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)

	// ...
}

参考资料

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