在敏感数据上使用损坏或弱的加密哈希算法¶
ID: swift/weak-sensitive-data-hashing
Kind: path-problem
Security severity: 7.5
Severity: warning
Precision: high
Tags:
- security
- external/cwe/cwe-327
- external/cwe/cwe-328
Query suites:
- swift-code-scanning.qls
- swift-security-extended.qls
- swift-security-and-quality.qls
使用损坏或弱的加密哈希函数会导致数据易受攻击,不应在安全相关的代码中使用。
强大的加密哈希函数应该能抵抗
原像攻击。如果您知道一个哈希值
h(x)
,您应该无法轻松找到输入x
。碰撞攻击。如果您知道一个哈希值
h(x)
,您应该无法轻松找到另一个具有相同哈希值的输入y
h(x) = h(y)
。例如,MD5 和 SHA-1 都已知容易受到碰撞攻击。
由于在非安全环境中使用弱加密哈希函数是可以的,因此此查询仅在将这些函数用于哈希敏感数据(如密码、证书、用户名)时才会发出警报。
建议¶
确保您使用强大的现代加密哈希函数,例如
Argon2、scrypt、bcrypt 或 PBKDF2 用于密码和其他输入空间有限且字典式攻击可行的数据。
SHA-2 或 SHA-3 用于其他情况。请注意,用于确保消息来自特定发送者的专用算法存在于消息身份验证中。在适当的情况下应使用这些算法,因为它们解决了此环境中简单哈希方案的常见漏洞。
示例¶
以下示例显示了一个用于从 URL 获取数据以及数据哈希值的函数,也许是为了检查数据是否被篡改。
在第一种情况下,使用了已知容易受到碰撞攻击的 MD5 哈希算法。
func getContentsAndHash(url: URL) -> (Data, String)? {
guard let data = try? Data(contentsOf: url) else {
return nil
}
let digest = Insecure.MD5.hash(data: data) // BAD: MD5 is not suitable for hashing sensitive data.
let hash = digest.map { String(format: "%02hhx", $0) }.joined()
return (data, hash)
}
这是使用 SHA-512 的相同函数,SHA-512 是一种强大的加密哈希函数。
func getContentsAndHash(url: URL) -> (Data, String)? {
guard let data = try? Data(contentsOf: url) else {
return nil
}
let digest = SHA512.hash(data: data) // GOOD: SHA-512 is suitable for hashing sensitive data.
let hash = digest.map { String(format: "%02hhx", $0) }.joined()
return (data, hash)
}