CodeQL 文档

在敏感数据上使用损坏或弱的加密哈希算法

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

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

使用损坏或弱的加密哈希函数会导致数据易受攻击,不应在安全相关的代码中使用。

强大的加密哈希函数应该能抵抗

  • 原像攻击。如果您知道一个哈希值 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)
}

参考资料

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