CS Skills/Software

Password 만들 때 hash와 salt

Youngjin Kwak 2023. 11. 4. 10:05

Password를 DB에 저장할 때 일반적으로 request로 들어온 패스워드를 그냥 저장하지 않습니다. 대부분의 경우 Hash 알고리즘을 사용해서 DB에 저장합니다. Hash화된 패스워드를 해커들에 의해 유출되더라도 해커들이 눈으로 읽지 못해 로그인하는 건 쉽지 않습니다

 

문제점

그러나 모든 것에 답을 찾듯 해커들도 이를 복호화 하기 위한 방법을 많이 연구했습니다. 복호화 방법으로 나온 것이 Rainbow Table입니다. Rainbow Table에는 많은 패스워드에 대한 hash 결과값을 가지고 있습니다. 그래서 해커들은 테이블에 내용과 뺏어온 패스워드를 비교하여 복호화를 진행 합니다. 이를 Rainbow Table Attack 이라고 부릅니다.

옛날에는 컴퓨터와 알고리즘이 좋지 않았기 때문에 크게 문제되지 않았습니다. 하지만 요즘에는 컴퓨터와 알고리즘의 향상으로인해 빠른 속도로 테이블과 비교하여 패스워드를 복호화 시킬 수 있게 되었습니다.

이를 해결하려고 복잡한 hash 알고리즘을 선택할 수 있으나, 이는 패스워드 생성 시간을 길게 만들어 유저들에게 불편함을 불러 이르키고 DB 사이즈를 거대하게 만들 수 있습니다.

 

SALT

Salt Flow

현대에 들어와서는 Salt 방식을 이용하여 이를 간단하게 해결하고 있습니다. Salt는 소금이란 뜻으로 요리에서 맛을 낼때 사용합니다. 패스워드에 소금을 친다고 생각하면 됩니다. Salt에는 개발자가 원하는 임의의  변수가 들어갑니다. 예를들어, "MyFiRsTSaLt" 같은 이상한 단어도 될 수 있습니다. Salt는 주로 패스워드 앞이나 혹은 뒤에 붙습니다. 그런다음 이를 Hash화 하여 DB에 저장합니다. 이렇게 생성된 Salt Password는 해커들이 Salt와 Salt 추가 위치를 알지 않는 이상 Rainbow table을 이용하여 복호화를 진행시키기 어렵습니다. 일반적으로, Database에 salt용 column을 만들어 저장합니다.

간단 정리

  • 매번 다른 변수로 저장
  • 주로 패스워드의 앞이나 뒤에 단어를 붙임
  • 데이터베이스에 저장

추가적인 방법

Salt 이외에 여러가지 방법이 존재합니다.

Pepper

Pepper는 salt와 유사하지만 Pepper의 경우 고정된 변수를 사용합니다. 고정된 변수이기 때문에 .env와 같은 곳에 저장해서 사용 할 수 있고, 변수를 만드는 과정이 필요없습니다. 하지만 보안 측면에서는 Salt에 비해 안 좋습니다.

Key stretch

Key strech

Key stretch 는 Hash화된 Password에 한번 혹은 여러번의 Hash 과정을 추가적으로 거치는 것입니다.

Salt된 Password에 Key Stretch 방식을 더해 저장합니다.