[시큐어코딩 가이드] 2-2-4. 취약한 암호화 알고리즘 사용

취약한 암호화 알고리즘 사용

정의

  • 개발자들은 환경설정 파일에 저장된 패스워드를 보호하기 위해 간단한 인코딩 함수를 이용해 패스워드를 감추는 방법을 사용하기도 하는데, 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(한국인터넷진흥원)