Hashing with Salt and Pepper

두비니

·

2023. 1. 4. 03:29

 

 


Hashing with Salt and Pepper

Server-Side Password Storage


 

 

1. 개요

 

해시함수는 실생활에서도 자주 이용되고 있습니다.

임의의 값에 대해 고정된 길이로 매핑할 수 있기 때문에 보통 hash table의 형태로 많이 사용되고 있습니다.

 

 

오늘은 단순한 해시 함수가 아닌, Salt와 Pepper를 사용한 해시 함수에 대해서 설명하고자 합니다.

 

 

2. 배경지식

 

예를 들어 한 서비스에서 비밀번호를 hash table의 형태로 관리하고 있다고 가정합시다.

그러면 예를 들어 아래와 같이 hash table이 저장되어있겠죠?

 

User Hash
Alice 20A0B08E69
Bob 630B0260BC
Charlie 20A0B08E69
Daisy 82B97C9972

 

그러면 예를 들어 Alice가 로그인을 시도한다면 다음과 같이 진행될 것입니다.

 

 

Client에서 해시 함수를 실행시키고,

해시 값을 대조하여 유저를 찾아내는 방식을 택할 것입니다.

다만 여기서 문제는, 단순히 해시 함수만 사용할 경우 같은 해시값이 생성될 수 있다는 것입니다.

 

id는 중복생성 탐지를 하더라도 비밀번호는 중복탐지를 하지 않기 때문에 서로 다른 두 유저에 대해 같은 비밀번호를 사용하는 경우가 발생할 수 있습니다.

실제로도 위의 경우를 보면 Alice와 Charley가 같은 비밀번호를 사용하고 있구요.

 

이런 경우에는 타인의 계정으로 로그인이 될 수도 있습니다.

나아가 DB유출이 될 경우 해시 함수에 대한 공격을 진행할 수 있을 뿐더러, 적어도 Alice와 Charly가 같은 비밀번호를 사용할 수 있다는 것을 파악할 수 있습니다.

이를 방지하기 위해 Salt와 Pepper가 사용되는데, 이에 대해서 더 알아보도록 하겠습니다.

 

 

3. Hash Function with Salt

 

위와 같은 문제를 해결하기 위해 Salt를 사용할 수 있습니다.

단순히 H(pw)였던 과정을 H(pw, salt)로 늘리는 것입니다.

이때, salt는 모든 유저에 대해 다르게 설정하여, 설령 같은 비밀번호를 사용하더라도 다른 해시 값이 저장되도록 합니다.

이를 도식으로 나타내면 다음과 같습니다.

 

 

 

 

이렇게 비밀번호를 저장할 경우 Rainbow Table Attack같은 Pre-computated hash를 통한 공격들이 불가능해집니다.

사용되는 해시 함수를 알고있다고 하더라도, 모든 유저에 대해 다른 salt값이 사용되기 때문이죠.

그러나 아직 공격 자체는 가능합니다.

DB에 Hash와 Salt가 같이 저장되어있기 때문에 H(pw, salt) = Hash 에서 pw만 모르는 상황이기 때문이죠.

이를 해결하기 위해 Pepper를 사용합니다.

 

 

 

4. Hash Function with Salt and Pepper

 

Pepper는 Salt가 가지고 있는 단점 또한 보완하기 위해 만들어졌습니다.

Pepper의 핵심은 DB에도 저장되지 않는다는 것입니다.

케이스 바이 케이스인 것 같긴 하지만, 대체적으로 서버별로 단일 Pepper를 사용하는 것 같습니다.

 

 

 

 

이 경우 DB가 유출된다고 한들 pepper를 알 수 없기 때문에, 이를 브루트포싱하는 노력이 추가적으로 필요합니다.

그러나 현실적으로 훨씬 더 많은 컴퓨팅 자원이 들어가기 때문에, 안전하다고 하는 것 같습니다.

 

 

5. 결론

 

오늘은 Hash Function의 다양한 종류에 대해서 알아보았습니다.

 

끝!

 

 

참고: https://www.youtube.com/watch?v=FvstbO787Qo