Reversible One Way Hash in hashlib
Module
The Python module hashlib
provides a number of functions for hashing data.
However, some of the hash algorithms supported by hashlib
are insecure and
should not be used. These insecure hash algorithms include MD4
, MD5
,
RIPEMD-160
and SHA-1
.
The MD4 hash algorithm is a cryptographic hash function that was designed in the late 1980s. MD4 is no longer considered secure, and passwords hashed with MD4 can be easily cracked by attackers.
The MD5 hash algorithm is a cryptographic hash function that was designed in the early 1990s. MD5 is no longer considered secure, and passwords hashed with MD5 can be easily cracked by attackers.
RIPEMD-160 is a cryptographic hash function that was designed in 1996. It is considered to be a secure hash function, but it is not as secure as SHA-256, SHA-384, or SHA-512. In 2017, a collision attack was found for RIPEMD-160. This means that it is possible to find two different messages that have the same RIPEMD-160 hash. While this does not mean that RIPEMD-160 is completely insecure, it does mean that it is not as secure as it once was.
The SHA-1 hash algorithm is also a cryptographic hash function that was designed in the early 1990s. SHA-1 is no longer considered secure, and passwords hashed with SHA-1 can be easily cracked by attackers.
Example
import hashlib
hash = hashlib.md5(b"Nobody inspects the spammish repetition")
hash.hexdigest()
Remediation
- hashlib.sha256
- usedforsecurity
The recommendation is to swap the insecure hashing method to one of the more
secure alternatives, SHA256
or SHA512
.
import hashlib
hash = hashlib.sha256(b"Nobody inspects the spammish repetition")
hash.hexdigest()
If an insecure hash such as MD5 must be used and not in within a security
context, then set the keyword-only argument usedforsecurity
in the hashes
constructor.
import hashlib
hash = hashlib.md5(b"Non-security related text", usedforsecurity=False)
hash.hexdigest()
False Positives
In the case of a false positive the rule can be suppressed. Simply add a
trailing or preceding comment line with either the rule ID (PY004
) or
rule category name (reversible_one_way_hash
).
- Using rule ID
- Using category name
import hashlib
# suppress: PY004
hash = hashlib.md5(b"Nobody inspects the spammish repetition")
hash.hexdigest()
import hashlib
# suppress: reversible_one_way_hash
hash = hashlib.md5(b"Nobody inspects the spammish repetition")
hash.hexdigest()