본문 바로가기
Hack/Cryptocurrency

Hash, Salt, Pepper

by Becoming a Hacker 2022. 9. 6.
반응형

Hash

Hash 함수란 임의의 길이를 갖는 데이터를 입력할 경우 고정된 길이의 고유한 데이터로 매핑되는 함수를 의미합니다. 그리고 특정 입력 값에 매핑되는 특정 출력 값을 바로 Hash 라고 합니다.

Hash 동작 과정

 

Hash는 여러가지 특징이 존재하지만 그 중 가장 중요한 특징 중 하나로 "Hash 함수를 거쳐 출력된 값을 통해 입력 값을 유추할 수 없다(단방향)"는 점이 있습니다.

 

이 의미를 조금 더 쉽게 설명하자면, "a"의 Hash 값이 무엇인지는 "a"를 Hash 함수의 인자로 사용함으로써 쉽게 확인할 수 있지만, "a의 Hash 값"을 통해서는 "a"를 유추할 수 없다고 설명할 수 있을 것 같습니다.

 

그리고 또 다른 주요 특징으로 "입력 값이 조금이라도 변경된다면 출력 값이 크게 달라진다"는 특징도 가지고 있습니다.

입력 값의 변화에 따른 출력 값의 변화

 

그리고 이러한 특징으로 인해 Hash 함수는 주로 검증 용도로 사용이 되어왔습니다. 예를 들어 사용자의 패스워드는 비교를 위해 DB와 같은 저장공간에 따로 저장을 하고 있어야 하지만, 만약 DB에 저장된 평문의 패스워드가 유출될 경우 이는 매우 큰 보안 사고로 이어질 수 있습니다.

 

그렇기 때문에 평문의 패스워드를 DB에 저장하는 방법보다는 사용자의 입력 값을 Hash 함수를 통해 치환한 Hash 값을 DB에 저장하는 방법으로 보안성을 향상시켜 왔습니다.

 

Salt와 Pepper

그렇다면 특정 사이트에서 사용자의 패스워드에 대한 Hash 값이 유출될 경우 100% 안전하다고 볼 수 있을까요?

 

정답은 100% 안전하다고 볼 수 없다 입니다.

 

이유는 서버의 구성에 따라 여러가지가 있을 수 있겠지만, 그 중 한 가지 이유로 Rainbow Table Attack으로 Hash 값을 통해 평문의 패스워드를 획득할 수 있다는 점을 들 수 있습니다.

 

바로 위에서는 단방향이기 때문에 Hash 값을 통해 기존의 평문 데이터를 획득할 수 없다고 이야기 했는데.. 왜 획득할 수 있다고 말을 바꿨을까요?

 

이유를 알기 위해서는 Rainbow Table이 무엇인지 알고 있어야 하는데요.

 

Rainbow Table이란 Hash 함수를 통해 만들어낼 수 있는 값을 사전에 미리 대량으로 저장한 테이블이며, 특정 Hash 값과 Rainbow Table에 저장된 Hash 값을 비교하여 평문의 데이터를 획득하는 공격이 바로 Rainbow Table Attack 입니다.

Rainbow Table Attack

 

원칙적으로는 불가능한 평문의 데이터 획득을 편법으로나마 획득하기 위해 나온 공격 방법이라고 이해하시면 좋을 것 같습니다.

 

이럴 듯 Hash 함수를 이용한다고 해서 100% 안전한 것은 아니기 때문에 조금 더 보안성을 강화하기 위해 나온 것이 바로 Salt와 Pepper 입니다.

Salt : 각각의 입력 값에 대응하는 임의로 생성된 데이터 (랜덤 값)

Pepper : 모든 입력 값에 공통으로 사용되는 데이터 (고정된 값)

 

Salt와 Pepper는 사용자가 입력한 값에 더해져서 Hash를 생성하는데 사용됩니다.

사용자 입력 값 : a

Salt (랜덤으로 생성된 값) : b

Pepper (고정된 값) : c

결과 : "a"+"b"+"c" -> "abc"에 대한 Hash 값 

사용자 입력 값 + salt + pepper

 

이럴듯 Salt와 Pepper를 사용하게 되면, DB에서 Hash 값이 유출되더라도 Salt와 Pepper의 값이 포함된 데이터에 대한 Hash 값이기 때문에 평문의 데이터를 획득하기가 매우 어려워집니다.

※ 사용자 입력 값  + Salt + Pepper가 포함된 입력 값은 길이가 매우 클 뿐만 아니라 대부분의 경우 사용되지 않는 데이터이기 때문에 Rainbow Table에 포함될 가능성이 낮아지기 때문

 

여기서 한 가지 유의사항이 있는데, 반드시 Salt와 Pepper는 서로 독립된 저장공간에 들어있어야 한다는 점 입니다. 왜냐하면 Salt와 Pepper가 동일한 DB에 저장된다면, DB 내 Data가 유출될 경우 Salt와 Pepper를 획득할 수 있기 때문에 보안성이 약해지기 때문입니다.

 

그러면 이것으로 포스팅을 마무리 하도록 하겠습니다. 오늘도 블로그에 방문해주셔서 감사합니다.

댓글