[시큐어코딩 가이드] 2-2-14. 솔트 없이 일방향 해시 함수 사용

솔트 없이 일방향 해시 함수 사용

정의

  • 중요정보를 솔트(Salt)없이 일방향 해시함수를 사용해 저장한다면, 공격자는 미리 계산된 레인보우 테이블을 이용해 해시값을 알아낼 수 있다.

 

안전한 코딩기법

  • 패스워드와 같이 중요정보를 저장할 경우, 가변 길이 데이터를 고정된 크기의 해시값으로 변환해 주는 일방향 해시함수를 이용해 저장한다.
  • 솔트값은 사용자별로 유일하게 생성해야 하며, 이를 위해 사용자별 솔트 값을 별도로 저장하는 과정이 필요하다.

 

코드예제

다음은 안전하지 않은 코드예제로, salt 없이 길이가 짧은 패스워드를 해시함수에 전달해 원문이 공격자에 의해 쉽게 유추되는 코드입니다.

#솔트 없이 일방향 해시 함수 사용(안전X)
def get_hash_from_pwd_bad(pw):
    h = hashlib.sha256(pw.encode())
    return h.digest()

 

다음은 안전한 코드예제로, 짧은 길이의 패스워드로 강도 높은 해시값을 생성하기 위해서는 반드시 솔트 값을 함께 전달해야합니다.

#솔트 없이 일방향 해시 함수 사용(안전O)
def get_hash_from_pwd_good(pw):
    salt = secrets.token_hex(32)
    h = hashlib.sha256(salt.encode() + pw.encode())
    return h.digest(), salt

 

 

 

보안기능/솔트 없이 일방향 해시 함수 사용

[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)