취약한 암호화 알고리즘 사용
정의
- 개발자들은 환경설정 파일에 저장된 패스워드를 보호하기 위해 간단한 인코딩 함수를 이용해 패스워드를 감추는 방법을 사용하기도 하는데, base64와 같은 지나치게 간단한 인코딩 함수로는 패스워드를 제대로 보호할 수 없다.
- 표준화되지 않은 암호화 알고리즘을 사용하는 것은 공격자가 알고리즘을 분석해 무력화시킬 수 있는 가능성을 높일 수도 있다.
안전한 코딩기법
- 자신만의 암호화 알고리즘을 개발하는 것은 위험하며, 학계 및 업계에서 이미 검증된 표준화된 알고리즘을 사용해야 한다.
- 3TDEA, AES, SEED(O) / DES, RC5, 2TDEA, Blowfish, ARC2, ARC4 (X)
코드예제
다음은 안전하지 않은 코드 예제로, DES 알고리즘으로 암호화 하는 코드입니다. 아래 코드는 파이썬 3.x버전에서는 작동이 안되는 경우가 발생합니다.
#취약한 암호화 알고리즘 사용(안전X)
import base64
import Crypto.Cipher import DES
import Crypto.Util.Padding import pad
def get_enc_text_bad(plain_text, key):
cipher_des = DES.new(key, DES.MODE_ECB)
encrypted_data = base64.b64encode(cipher_des.encrypt(pad(plain_text, 32)))
return encrypted_data.decode('ASSCII')
다음은 안전한 코드 예제로 DES 알고리즘 대신 안전한 AES 알고리즘을 사용한 코드입니다.
#취약한 암호화 알고리즘 사용(안전O)
import base64
import Crypto.Cipher import AES
import Crypto.Util.Padding import pad
def get_enc_text_good(plain_text, key):
cipher_aes = AES.new(key, AES.MODE_ECB)
encrypted_data = base64.b64encode(cipher_aes.encrypt(pad(plain_text, 32)))
return encrypted_data.decode('ASSCII')
다음은 MD5 해시함수를 사용하는 코드로 안전하지 않은 코드예제입니다.
#취약한 암호화 알고리즘 사용(안전X)
def make_md5(request):
plain_text = request.GET.get('plain_text')
hash_text = hashlib.md5(plain_text.encode('utf-8')).hexdigest()
return render(request, "success.html", {'msg': f"MD5 : {hash_text}"})
plain_text=hello
아래코드는 수학적으로 안전하다고 알려진 SHA-256 해시함수를 사용한 코드로 안전한 코드예제입니다.
#취약한 암호화 알고리즘 사용(안전O)
def make_sha256(request):
plain_text = request.GET.get('plain_text')
hash_text = hashlib.sha256(plain_text.encode('utf-8')).hexdigest()
return render(request, "success.html", {'msg': f"SHA256 : {hash_text}"})
plain_text=hello
보안기능/취약한 암호화 알고리즘 사용
[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)