[시큐어코딩 가이드] 솔트 없이 일방향 해쉬 함수 사용
- 정보보안/시큐어코딩 가이드
- 2022. 8. 9.
■ 보안기능
보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.
솔트 없이 일방향 해쉬 함수 사용
■ 개요
패스워드와 같은 중요정보를 저장할 경우, 임의의 길이인 데이터를 고정된 크기의 해쉬값으로 변환해주는 일방향 해쉬함수를 이용하여 저장한다. 만약 중요정보를 솔트(Salt)없이 일방향 해쉬함수를 사용하여 저장한다면, 공격자는 미리 계산된 레인보우 테이블을 이용하여 해쉬값을 알아낼 수 있다.
■ 안전한 코딩 기법
패스워드와 같은 중요정보를 저장할 경우, 임의의 길이인 데이터를 고정된 크기의 해쉬값으로 변환해주는 일방향 해쉬함수를 이용하여 저장한다.
Python에서 hashlib라이브러리를 사용해서 Hash값을 생성 할 수 있고, salt 값은 os.urandom()등 안전한 난수 생성 라이브러리를 사용하여 생성해야 한다.
코드예제
아래 예시와 같은 코드는 비밀번호와 같은 값을 해쉬하고 있는데 원문의 길이가 짧기 때문에 공격자에 의해 쉽게 유추될 수 있다.
안전하지 않은 코드의 예 |
import hashlib def get_hash_from_pwd(pw): # salt가 없이 생성된 해시값은 강도가 약하기 때문에 반드시 salt와 함께 # 생성해야 한다. h = hashlib.sha256(pw.encode()) return h.digest() |
짧은 길이의 비밀번호를 이용하여 강도 높은 해쉬값을 생성하기 위해서는 반드시 seed 값과 함께 해쉬를 해야 한다.
안전한 코드의 예 |
import hashlib import secrets def get_hash_from_pwd(pw): # 비밀번호와 같이 길이가 짧은 값을 이용하여 # 고강도의 해시를 생성하기 위해서는 salt값을 # 사용하면 강도높은 해시를 생성할 수 있다 salt = secrets.token_hex(32) h = hashlib.sha256(salt.encode() + pw.encode()) return h.digest(), salt |