: 암호화 기술 실패라는 의미로 암호화 기술의 취약점을 다루며, 불안전한 암호화 방식이나 키 관리 실패로 인한 데이터 유출과 보안 위협을 포함한다.
이 카테고리는 잘못된 구현, 알고리즘 선택, 키 노출 등으로 민감한 데이터의 노출까지 발생하는 문제를 강조하며, 보안 강화를 위해 강력한 암호화 표준과 적절한 키 관리가 필요함을 강조한다.
2017년 대비 한 단계 상승해 두 번째 항목으로 선정.
내·외부망에 관계없이 데이터가 전송구간에서 평문으로 전송되는 경우(HTTP, FTP, TELNET 등)
취약한 암호화 프로토콜/알고리즘/컴포넌트 를 사용하는 경우(프로토콜: SSL v2.0, SSL v3.0/알고리즘: DES, RC4, MD5 /컴포넌트:취약한 버전의 openssl 등)
보안 헤더 설정을 통한 HSTS가 누락된 경우(HSTS : HTTP를 HTTPS로 강제 리다이렉트)
고정된 암호문을 사용하는 경우(Salt, 일회용 난수 미포함)
사설 인증서 사용, 인증서와 도메인 불일치
암호키 관리가 미흡한 경우(소스코드 하드코딩 등)
예측 가능한 키 생성
충분한 난수를 사용하지 않아 공격자가 키를 예측할 수 있는 경우(시간 기반 난수/정적 값 사용/시드값이 약한 경우)
민감한 데이터 저장 최소화
: 민감한 데이터를 불필요하게 저장하지 말고, 가능한 한 빨리 폐기하거나 PCI DSS 준수 토큰화 또는 절단 사용.
데이터 암호화
: 모든 민감한 데이터를 저장 시 암호화
초기화 벡터
: 작동 모드에 적합한 초기화 벡터를 선택. 많은 모드에서는 CSPRNG(암호학적으로 안전한 의사 난수 생성기)를 사용해야 하며, 논스가 필요한 모드에서는 초기화 벡터(IV)에 CSPRNG가 필요하지 않다.모든 경우에 IV는 고정된 키에 대해 두 번 사용해서는 X.
키 생성 및 저장
: 키는 암호학적으로 랜덤하게 생성되어야 하며, 메모리에서 바이트 배열로 저장되어야 한다.비밀번호를 사용하는 경우, 적절한 비밀번호 기반 키 파생 함수를 통해 키로 변환해야 함.
: 비밀번호를 안전하게 저장하지 않음으로 인해 발생하는 취약점을 다룬다. 예를 들어, 평문 또는 약한 해싱 알고리즘을 사용하여 비밀번호를 저장하는 경우, 공격자가 쉽게 이를 복원하거나 추측할 수 있다. 이로 인해 사용자 계정이 쉽게 탈취될 수 있다. 안전한 해싱 방법(예: bcrypt, Argon2)을 사용하고, salt를 추가하여 강력한 인코딩을 적용하는 것이 중요하다.
: 해시 함수를 사용할 때 비밀번호와 함께 추가되는 무작위 데이터. 이를 통해 해시값이 고유하게 생성되도록 하여 동일한 비밀번호라도 서로 다른 해시값을 만들어냅니다.
'취약한 코드: 비밀번호를 평문으로 저장
def save_password(plain_password):
with open('passwords.txt', 'a') as file:
file.write(plain_password + '\n')
사용자 비밀번호 입력
user_password = input("Enter your password: ")
save_password(user_password)'
: 안전한 키 교환 과정에서 참여자의 신원을 확인하지 않는 취약점을 다룬다. 이로 인해 공격자가 중간자 공격을 통해 통신을 가로채거나 위조할 수 있습니다.
예를 들어, 공격자가 두 사용자 간의 키 교환 과정에 개입하여 자신이 신뢰할 수 있는 사용자처럼 행동할 수 있다. 이를 방지하기 위해서는 키 교환 과정에서 양측의 신원을 확인하는 인증 메커니즘(예: 디지털 서명, 인증서 사용)을 도입해야 함.
'취약한 코드: 인증 없는 키 교환
def key_exchange():
Alice와 Bob 간의 키 교환
alice_private_key = "Alice's private key"
bob_public_key = "Bob's public key"
키 교환
shared_key = alice_private_key + bob_public_key
return shared_key
shared_key = key_exchange()
print("Shared Key:", shared_key)'
: 암호화 키가 만료된 후에도 계속 사용되는 취약점을 의미. 만료된 키를 사용하면 보안성이 저하되고, 공격자가 해당 키를 악용할 수 있는 위험이 증가한다.
: 보안성이 낮은 해시 알고리즘을 사용하는 취약점을 의미한다. 약한 해시 알고리즘(예: MD5, SHA-1)은 충돌 공격에 취약하여, 공격자가 해시 값을 쉽게 위조하거나 예측할 수 있다.
'import hashlib
취약한 해시 사용: MD5
def hash_password(password):
return hashlib.md5(password.encode()).hexdigest()
user_password = "my_secure_password"
hashed_password = hash_password(user_password)
print("Hashed password:", hashed_password)'
: 사용자 자격 증명이 안전하지 않은 방법으로 전송될 때 발생하는 취약점. 예를 들어, 암호화되지 않은 HTTP를 통해 비밀번호나 API 키를 전송하는 경우, 공격자가 네트워크 트래픽을 가로채어 민감한 정보를 탈취할 수 있다.
import requests
자격 증명을 암호화 없이 전송
' url = "http://example.com/api/login"
credentials = {"username": "user", "password": "pass"}
response = requests.post(url, data=credentials)
print("Response:", response.text)'
->https를 사용해서 자격 증명을 보호하는 것이 좋은 코드