Detected Blowfish cipher algorithm which is considered insecure. This algorithm is not cryptographically secure and can be reversed easily. Use AES instead.
Run in CI
rules: - id: insecure-cipher-algorithm-blowfish message: Detected Blowfish cipher algorithm which is considered insecure. This algorithm is not cryptographically secure and can be reversed easily. Use AES instead. metadata: source-rule-url: https://github.com/PyCQA/bandit/blob/d5f8fa0d89d7b11442fc6ec80ca42953974354c8/bandit/blacklists/calls.py#L84 cwe: - "CWE-327: Use of a Broken or Risky Cryptographic Algorithm" owasp: - A03:2017 - Sensitive Data Exposure - A02:2021 - Cryptographic Failures bandit-code: B304 references: - https://stackoverflow.com/questions/1135186/whats-wrong-with-xor-encryption category: security technology: - pycryptodome subcategory: - vuln likelihood: LOW impact: MEDIUM confidence: MEDIUM license: Commons Clause License Condition v1.0[LGPL-2.1-only] severity: WARNING languages: - python pattern-either: - pattern: Cryptodome.Cipher.Blowfish.new(...) - pattern: Crypto.Cipher.Blowfish.new(...)
# cf. https://github.com/PyCQA/bandit/blob/b78c938c0bd03d201932570f5e054261e10c5750/examples/ciphers.py from Crypto.Cipher import AES from Crypto.Cipher import ARC2 as pycrypto_arc2 from Crypto.Cipher import ARC4 as pycrypto_arc4 from Crypto.Cipher import Blowfish as pycrypto_blowfish from Crypto.Cipher import DES as pycrypto_des from Crypto.Cipher import XOR as pycrypto_xor from Cryptodome.Cipher import ARC2 as pycryptodomex_arc2 from Cryptodome.Cipher import ARC4 as pycryptodomex_arc4 from Cryptodome.Cipher import Blowfish as pycryptodomex_blowfish from Cryptodome.Cipher import DES as pycryptodomex_des from Cryptodome.Cipher import XOR as pycryptodomex_xor from Crypto.Hash import SHA from Crypto import Random from Crypto.Util import Counter iv = Random.new().read(bs) key = b'An arbitrarily long key' plaintext = b'docendo discimus ' plen = bs - divmod(len(plaintext),bs) padding = [plen]*plen padding = pack('b'*plen, *padding) bs = pycrypto_blowfish.block_size # ruleid:insecure-cipher-algorithm-blowfish cipher = pycrypto_blowfish.new(key, pycrypto_blowfish.MODE_CBC, iv) msg = iv + cipher.encrypt(plaintext + padding) bs = pycryptodomex_blowfish.block_size # ruleid:insecure-cipher-algorithm-blowfish cipher = pycryptodomex_blowfish.new(key, pycryptodomex_blowfish.MODE_CBC, iv) msg = iv + cipher.encrypt(plaintext + padding) key = b'Sixteen byte key' # ok:insecure-cipher-algorithm-blowfish cipher = AES.new(key, AES.MODE_EAX, nonce=nonce) plaintext = cipher.decrypt(ciphertext) try: cipher.verify(tag) print("The message is authentic:", plaintext) except ValueError: print("Key incorrect or message corrupted")
Short Link: https://sg.run/dlOE