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

 

 

 

■ 보안기능

 

보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.

 

 

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

 

■ 개요

 

SW 개발자들은 환경설정 파일에 저장된 패스워드를 보호하기 위하여 간단한 인코딩 함수를 이용 하여 패스워드를 감추는 방법을 사용하기도 한다. 그렇지만 base64와 같은 지나치게 간단한 인코딩 함수로는 패스워드를 제대로 보호할 수 없다.


정보보호 측면에서 취약하거나 위험한 암호화 알고리즘을 사용해서는 안 된다. 표준화되지 않은 암호화 알고리즘을 사용하는 것은 공격자가 알고리즘을 분석하여 무력화시킬 수 있는 가능성을 높일 수도 있다. 몇몇 오래된 암호화 알고리즘의 경우는 컴퓨터의 성능이 향상됨에 따라 취약해지기도 해서, 예전에는 해독하는데 몇 십 억년이 걸릴 것이라고 예상되던 알고리즘이 며칠이나 몇 시간 내에 해독되기도 한다.

 

RC2 (ARC2), RC4 (ARC4), RC5, RC6, MD4, MD5, SHA1, DES 알고리즘이 여기에 해당된다.


Python 2에서는 PyCrypto를 사용하였지만 Python 3에서는 PyCryto를 개선한 PyCryptodomes를 사용하여야 한다.

 

 

■ 안전한 코딩 기법

 

자신만의 암호화 알고리즘을 개발하는 것은 위험하며, 학계 및 업계에서 이미 검증된 표준화된 알고리즘을 사용한다. 기존에 취약하다고 알려진 DES, RC5등의 암호알고리즘을 대신하여, 3DES, AES, SEED 등의 안전한 암호 알고리즘으로 대체하여 사용한다. 또한, 업무관련 내용, 개인정보 등에 대한 암호 알고리즘 적용 시, 암호모듈시험기에서 안전성을 확인한 검증필 암호모듈을 사용해야 한다.

 

 

코드예제

 

다음 예제는 취약한 DES 알고리즘으로 암호화하고 있다. DES 이외에 3DES, Blowfish, ARC2, ARC4 등의 취약한 알고리즘을 사용하지 않는다.

 

안전하지 않은 코드의 예
import base64
from Crypto.Cipher import DES

def get_enc_text(plain_text, key):
# 취약함 암호와 알고리즘인 DES를 사용하여 안전하지 않음
cipher_des = DES.new(key, DES.MODE_ECB)
encrypted_data = base64.b64encode(cipher_des.encrypt(plain_text))

return encrypted_data.decode('ASCII')

 

pycrypto 라이브러리는 python 3.x버전 환경에서 사용 시 동작을 하지 않는 경우가 발생하며, 더 이상 유지관리 되지 않으므로 pycrypto를 개선한 pycryptodome를 사용한다. 취약한 DES 알고리즘 대신 안전한 AES 암호화 알고리즘을 사용한다.

 

블록 암호화에서 운영모드를 ECB(Electronic Code Block) 모드를 사용할 경우 한 개의 블록만 해독되면 나머지 블록도 해독이 되는 단점이 있다. CBC(Cipher Block Chaining) 모드는 평문의 각 블록이 XOR연산을 통해 이전 암호문과 연산이 되기 때문에 같은 평문이라도 암호문이 서로 다르다. 

 

이러한 특성으로 보안성이 ECB 모드보다 높다.

 

안전한 코드의 예
import base64
from Crypto.Cipher import AES

def get_enc_text(plain_text, key, iv):
# 안전한 알고리즘인 AES 를 사용하여 안전함.
cipher_aes = AES.new(key, AES.MODE_CBC, iv)
encrypted_data = base64.b64encode(cipher_aes.encrypt(plain_text))

return encrypted_data.decode('ASCII')

 

다음 예제는 취약한 MD5 해쉬함수를 사용하고 있다.

 

안전하지 않은 코드의 예
fimport hashlib

def make_md5(plain_text):
# 취약한 md5 해쉬함수 사용
hash_text = hashlib.md5(plain_text.encode('utf-8')).hexdigest()

return hash_text

 

아래 코드처럼 안전하다고 알려진 sha-256 해쉬함수 등을 적용해야 한다.

 

안전한 코드의 예
import hashlib

def make_sha256(plain_text):
# 안전한 sha-256 해쉬함수 사용
hash_text = hashlib.sha256(plain_text.encode('utf-8')).hexdigest()

return hash_text

 

 

댓글

Designed by JB FACTORY