← 返回首页
Use of a broken or weak cryptographic hashing algorithm on sensitive data — CodeQL query help documentation CodeQL docs
CodeQL documentation
CodeQL resources

Use of a broken or weak cryptographic hashing algorithm on sensitive data

ID: rust/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 - external/cwe/cwe-916 Query suites: - rust-code-scanning.qls - rust-security-extended.qls - rust-security-and-quality.qls

Click to see the query in the CodeQL repository

A broken or weak cryptographic hash function can leave data vulnerable, and should not be used in security-related code.

A strong cryptographic hash function should be resistant to:

All of MD5, SHA-1, SHA-2 and SHA-3 are weak against offline brute forcing, so they are not suitable for hashing passwords. This includes SHA-224, SHA-256, SHA-384, and SHA-512, which are in the SHA-2 family.

Since it’s OK to use a weak cryptographic hash function in a non-security context, this query only alerts when these are used to hash sensitive data (such as passwords, certificates, usernames).

Recommendation

Ensure that you use a strong, modern cryptographic hash function, such as:

Example

The following examples show hashing sensitive data using the MD5 hashing algorithm that is known to be vulnerable to collision attacks, and hashing passwords using the SHA-3 algorithm that is weak to brute force attacks:

// MD5 is not appropriate for hashing sensitive data. let mut md5_hasher = md5::Md5::new(); ... md5_hasher.update(emergency_contact); // BAD md5_hasher.update(credit_card_no); // BAD ... my_hash = md5_hasher.finalize(); // SHA3-256 is not appropriate for hashing passwords. my_hash = sha3::Sha3_256::digest(password); // BAD

To make these secure, we can use the SHA-3 algorithm for sensitive data and Argon2 for passwords:

// SHA3-256 *is* appropriate for hashing sensitive data. let mut sha3_256_hasher = sha3::Sha3_256::new(); ... sha3_256_hasher.update(emergency_contact); // GOOD sha3_256_hasher.update(credit_card_no); // GOOD ... my_hash = sha3_256_hasher.finalize(); // Argon2 is appropriate for hashing passwords. let argon2_salt = argon2::password_hash::Salt::from_b64(salt)?; my_hash = argon2::Argon2::default().hash_password(password.as_bytes(), argon2_salt)?.to_string(); // GOOD

References