[시큐어코딩 가이드] 하드코드된 중요정보
- 정보보안/시큐어코딩 가이드
- 2022. 8. 9.
■ 보안기능
보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.
하드코드된 중요정보
■ 개요
프로그램 코드 내부에 하드코드된 패스워드를 포함하고, 이를 이용하여 내부 인증에 사용하거나 외부 컴포넌트와 통신을 하는 경우 관리자의 정보가 노출 될 수 있어 위험하다. 또한 하드코드된 암호화 키를 사용하여 암호화를 수행하면 암호화된 정보가 유출될 가능성이 높아진다. 암호키의 해쉬를 계산하여 저장하더라도 역계산이 가능하여 적어도 무차별 공격(Brute-Force)공격에는 취약할 수 있다.
■ 안전한 코딩 기법
패스워드는 암호화 하여 별도의 파일에 저장하여 사용한다. 또한 중요정보를 암호화하면, 상수가 아닌 암호화 키를 사용하도록 하며 암호화 되었더라도 소스코드 내부에 상수 형태의 암호화 키를 저장해서 사용하지 않도록 한다.
코드예제
소스코드에 패스워드 또는 암호화 키 같은 중요 정보를 하드코딩 하는 경우, 중요정보가 노출될 수 있어 위험하다.
안전하지 않은 코드의 예 |
import pymysql def query_execute(query): # usre, passwd가 소스코드에 평문으로 하드코딩되어 있음 dbconn = pymysql.connect(host='127.0.0.1', port='1234', user='root', passwd='1234',db='mydb', charset='utf8') curs = dbconn.cursor() curs.execute(query) dbconn.commit() dbconn.close() |
패스워드와 같은 중요정보는 안전한 암호화 방식으로 암호화하여 별도의 분리된 공간(파일)에 저장해야 하며, 암호화된 중요정보를 사용하기 위해서는 복호화 과정을 거쳐야 한다.
안전한 코드의 예 |
import pymysql import json def query_execute(query, config_path): with open(config_path, 'r') as config: # 설정파일에서 user, passwd를 가져와 사용 dbconf = json.load(fp=config) #암호화되어 있는 블록암호화 키를 복호화 해서 가져오는 #사용자 정의 함수 blockKey = get_decrypt_key('blockKey') # 설정파일에 암호화되어 있는 값을 가져와 복호화한 후에 사용 dbUser = decrypt(blockKey, dbconf['user']) dbPasswd = decrypt(blockKey, dbconf['passwd']) dbconn = pymysql.connect(host=dbconf['host'], port=dbconf['port'], user=dbUser, passwd=dbPasswd, db=dbconf['db_name'], charset='utf8') curs = dbconn.cursor() curs.execute(query) dbconn.commit() dbconn.close() |