강력한 암호 알고리즘은 암호 분석에 강한 암호화 시스템으로, 예를 들어 무차별 암호 대입 공격과 같은 잘 알려진 공격에 취약하지 않습니다.
일반적으로 암호화 커뮤니티에서 집중적으로 테스트하고 홍보하는 암호화 알고리즘만 사용할 것을 권장합니다.
특히 블록 암호의 경우 블록 크기가 128비트보다 작은 알고리즘은 사용하지 않는 것이 좋습니다.
규칙을 어긴 코드
pycryptodomex 라이브러리:
from Cryptodome.Cipher import DES, DES3, ARC2, ARC4, Blowfish, AES
from Cryptodome.Random import get_random_bytes
key = b'-8B key-'
DES.new(key, DES.MODE_OFB) # 규칙을 어긴 코드: DES는 56비트 키와 함께 작동하므로 철저한 검색을 통한 공격이 가능합니다.
key = DES3.adjust_key_parity(get_random_bytes(24))
cipher = DES3.new(key, DES3.MODE_CFB) # 규칙을 어긴 코드: Triple DES는 중간자 공격에 취약합니다.
key = b'Sixteen byte key'
cipher = ARC2.new(key, ARC2.MODE_CFB) # 규칙을 어긴 코드: RC2는 related-key 공격에 취약합니다.
key = b'Very long and confidential key'
cipher = ARC4.new(key) # 규칙을 어긴 코드: 여러 공격에 취약합니다. (see https://en.wikipedia.org/wiki/RC4#Security)
key = b'An arbitrarily long key'
cipher = Blowfish.new(key, Blowfish.MODE_CBC) # 규칙을 어긴 코드: 블로우피쉬는 64비트 블록 크기를 사용하기 때문에 생일 공격에 취약합니다.
pycryptodome 라이브러리:
from Crypto.Cipher import DES, DES3, ARC2, ARC4, Blowfish, AES
from Crypto.Random import get_random_bytes
key = b'-8B key-'
DES.new(key, DES.MODE_OFB) # 규칙을 어긴 코드: DES는 56비트 키와 함께 작동하므로 철저한 검색을 통한 공격이 가능합니다.
key = DES3.adjust_key_parity(get_random_bytes(24))
cipher = DES3.new(key, DES3.MODE_CFB) # 규칙을 어긴 코드: Triple DES는 중간자 공격에 취약합니다.
key = b'Sixteen byte key'
cipher = ARC2.new(key, ARC2.MODE_CFB) # 규칙을 어긴 코드: RC2는 related-key 공격에 취약합니다.
key = b'Very long and confidential key'
cipher = ARC4.new(key) # 규칙을 어긴 코드: 여러 공격에 취약합니다. (see https://en.wikipedia.org/wiki/RC4#Security)
key = b'An arbitrarily long key'
cipher = Blowfish.new(key, Blowfish.MODE_CBC) # 규칙을 어긴 코드: 블로우피쉬는 64비트 블록 크기를 사용하기 때문에 생일 공격에 취약합니다.
pyca 라이브러리:
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
key = os.urandom(16)
iv = os.urandom(16)
tdes4 = Cipher(algorithms.TripleDES(key), mode=None, backend=default_backend()) # 규칙을 어긴 코드: Triple DES는 중간자 공격에 취약합니다.
bf3 = Cipher(algorithms.Blowfish(key), mode=None, backend=default_backend()) # 규칙을 어긴 코드: 블로우피쉬는 64비트 블록 크기를 사용하기 때문에 생일 공격에 취약합니다.
rc42 = Cipher(algorithms.ARC4(key), mode=None, backend=default_backend()) # 규칙을 어긴 코드: 여러 공격에 취약합니다. (see https://en.wikipedia.org/wiki/RC4#Security)
pydes 라이브러리:
import pyDes;
des1 = pyDes.des('ChangeIt') # 규칙을 어긴 코드: DES는 56비트 키와 함께 작동하므로 철저한 검색을 통한 공격이 가능합니다.
des2 = pyDes.des('ChangeIt', pyDes.CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=pyDes.PAD_PKCS5) # 규칙을 어긴 코드: DES는 56비트 키와 함께 작동하므로 철저한 검색을 통한 공격이 가능합니다.
tdes1 = pyDes.triple_des('ChangeItWithYourKey!!!!!') # 규칙을 어긴 코드: Triple DES는 중간자 공격에 취약합니다.
tdes2 = pyDes.triple_des('ChangeItWithYourKey!!!!!', pyDes.CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=pyDes.PAD_PKCS5) # 규칙을 어긴 코드: Triple DES는 중간자 공격에 취약합니다.
pycrypto 라이브러리는 유지보수되고 있지 않기 때문에 사용해서는 안됩니다:
from Crypto.Cipher import *
des3 = DES.new('ChangeIt') # 규칙을 어긴 코드: DES는 56비트 키와 함께 작동하므로 철저한 검색을 통한 공격이 가능합니다.
tdes3 = DES3.new('ChangeItChangeIt') # 규칙을 어긴 코드: Triple DES는 중간자 공격에 취약합니다.
bf2 = Blowfish.new('ChangeItWithYourKey', Blowfish.MODE_CBC, 'ChangeIt') # 규칙을 어긴 코드: 블로우피쉬는 64비트 블록 크기를 사용합니다.
rc21 = ARC2.new('ChangeItWithYourKey', ARC2.MODE_CFB, 'ChangeIt') # 규칙을 어긴 코드: RC2는 related-key 공격에 취약합니다.
rc41 = ARC4.new('ChangeItWithYourKey') # 규칙을 어긴 코드: 여러 공격에 취약합니다. (see https://en.wikipedia.org/wiki/RC4#Security)
규칙을 준수한 해결책
pycryptodomex 라이브러리:
from Cryptodome.Cipher import AES
key = b'Sixteen byte key'
cipher = AES.new(key, AES.MODE_CCM) # 규칙을 준수한 코드
pycryptodome 라이브러리:
from Crypto.Cipher import AES
key = b'Sixteen byte key'
cipher = AES.new(key, AES.MODE_CCM) # 규칙을 준수한 코드
pyca 라이브러리:
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
key = os.urandom(16)
iv = os.urandom(16)
aes2 = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) # 규칙을 준수한 코드
pycrypto 라이브러리는 유지보수되고 있지 않기 때문에 사용해서는 안됩니다:
from Crypto.Cipher import *
aes1 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') # 규칙을 준수한 코드
같이보면 좋은 자료
- OWASP Top 10 2021 Category A2 - 암호화 실패
- OWASP Top 10 2017 Category A3 - 민감한 데이터 노출
- MITRE, CWE-327 - 깨지거나 위험한 암호화 알고리즘 사용
-
SANS Top 25 - 다공성 방어
If you like SONARKUBE, don’t forget to give me a star.