ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Database] 비밀번호 안전하게 저장하기(해시함수, 솔트)
    카테고리 없음 2020. 4. 4. 19:43

    로그인 시스템을 만든다고 가정해보자. 가장 중요한 것 중 하나는 사용자의 비밀번호를 저장하는 것이다. 예를 들어 다음과 같은 사용자 계정이 있다고 하자. 

    id leomessi
    password goat_10

     

    만약 클라이언트에서 받아온 정보를 그대로 데이터베이스에 저장한다면 어떻게 될까. 데이터베이스에 접근하는 모든 사람이 사용자의 비밀번호를 알게 될 것이다. 정보 유출의 가능성이 너무나 높은 위험한 방법이다. 

    따라서 비밀번호는 암호화되어 저장되어야 한다. 암호화에서 가장 많이 쓰이는 방법 중 하나가 바로 해시함수를 사용하는 것이다.

    *해시함수 (Hash Function)

    해시함수는 주어진 정보를 암호화시켜주는 역할을 한다. 예를 들어 'abc'라는 값을 해시함수에 넣으면 'lkjafs@ufkf/#!'와 같이 변환된다. 

    해시함수는 다음 세 가지 특징을 가지고 있다.

    첫째, 동일한 입력값에 대한 동일한 출력값을 가지고 있다. 입력값이 동일하면 출력값도 동일하다. 'abc' 라는 값을 한 번을 넣든 여러 번을 넣든 같은 결과가 출력된다.

    둘째, 입력값이 조금만 변경되어도 전혀 다른 값이 나온다. 'abc' 라는 값이 '5al#de' 라는 값으로 변환되었다면 여기에 한 글자를 더한 'abcd' 는 'd8#apPD&' 과 같이 전혀 다르게 생긴 값이 출력된다. 

    셋째, 해시함수는 일방향으로만 움직인다. 인풋값 통해 암호화된 아웃풋값을 얻을 수는 있지만, 암호화된 아웃풋을 통해 원래의 인풋값을 얻을 수는 없다. 

    해시함수를 이용해 비밀번호를 관리하게 된다면, 데이터베이스에는 원래 암호인 'goat_10'이 아닌 해시함수에 의해 암호화된 출력값이 저장될 것이다. 따라서 누군가 데이터베이스에 저장된 비밀번호 정보를 보더라도 실제 비밀번확 무엇인지는 알 수 없게 된다. 왜냐하면 해당 데이터는 'mDH30@#aKd$e' 과 같은 값으로 저장되어 있을 것이기 때문이다.

    *솔트(Salt)

    레인보우 테이블은 해시함수를 통해 만들어놓은 값을 저장해놓은 표를 말한다. 해시함수를 이용해 저장된 비밀번호로부터 원래의 비밀번호를 추출해내는 데 사용된다. 

    이러한 위험을 줄이기 위해 사용하는 것이 솔트(Salt)솔트는 짧은 랜덤 텍스트를 의미한다. 데이터베이스에 비밀번호를 저장할 때, 유저가 설정한 비밀번호를 솔트와 함께 섞어 해싱한다.

    예를 들어 위 솔트값이 'kexp' 라고 하자. 그렇다면 위 계정의 비밀번호는 아래와 같이 저장된 후 해싱될 것이다.

    'kexp' (솔트) + 'goat_10' (비밀번호)  >> Hash!

    비밀번호가 아무리 간단하다 하더라도 솔트가 추가된 상태로 생성되었으므로 안정성이 높아진다고 생각할 수 있다.

    * Reference : 노마드 코더 ( https://www.youtube.com/watch?v=67UwxR3ts2E ), 해쉬넷(https://bit.ly/39EMU2T)

    댓글