seegongsik
보안

어떻게 같은 비밀번호의 함정, 소금 한 꼬집

앞 레슨에서 비밀번호는 그대로 저장하지 않고 해시 지문으로 바꿔 저장한다고 했다. 그런데 두 사람이 우연히 같은 비밀번호를 쓰면 어떻게 될까? 같은 입력은 같은 지문을 내므로 저장된 목록에 똑같은 값이 나란히 찍힌다. 비밀번호를 몰라도 두 사람의 비밀번호가 같다는 사실은 드러나요. 이 틈을 막으려고 사람마다 다른 값을 한 꼬집 섞는데, 이것을 솔트라고 부른다.

01

같은 비밀번호는 같은 해시가 돼요

해시는 같은 입력에 늘 같은 결과를 낸다. 그래야 로그인할 때 입력의 지문을 저장된 지문과 맞춰 볼 수 있었다. 그런데 이 성질에는 그림자가 있어요.
두 사람이 같은 비밀번호를 쓰면 두 사람의 해시도 똑같이 나온다. 저장된 해시 목록에 같은 값이 나란히 있으면, 비밀번호 자체는 몰라도 둘이 같다는 사실이 새어 나간다. 한 사람의 비밀번호가 알려지면 같은 해시를 가진 사람의 비밀번호도 함께 알려진다.

사람 A비밀번호 고르기
사람 B비밀번호 고르기
저장된 해시
1f8ba1f8ba
같은 비밀번호라 해시도 똑같이 나란히 보여요

두 사람의 비밀번호를 같게도, 다르게도 골라 보자. 비밀번호가 같으면 저장된 해시도 똑같이 나란히 보여요.

같은 비밀번호를 고르자 두 해시가 똑같았다. 해시만 봐도 같다는 것이 바로 드러난다. 해시는 거꾸로 계산할 수 없다고 배웠지만, 같은 값이 같은 해시를 낸다는 점은 변하지 않아요.
그렇다면 누군가 흔한 비밀번호들을 미리 해시해서 목록으로 적어 두면 어떻게 될까?

02

미리 만든 표는 왜 위험할까

사람들이 흔히 쓰는 비밀번호는 생각보다 가짓수가 적다. 그래서 그런 비밀번호와 각각의 해시를 미리 한 줄씩 적어 둔 표를 만들 수 있어요. 이런 표가 있으면 털린 저장소의 해시를 표에서 찾아 원래 비밀번호를 곧바로 알아낸다.
해시를 거꾸로 푸는 것이 아니라 미리 적어 둔 답과 맞춰 보는 것이다. 수많은 해시를 표 하나로 한꺼번에 맞춰 볼 수 있다는 점이 특히 위험하다. 이런 표를 효율적으로 압축해 둔 것을 레인보우 테이블이라고 부른다.

저장된 해시
저장된 해시를 눌러 보기
미리 적어 둔 표
?1a3f7c
?4b8e21
?9d0c55

저장된 해시를 하나씩 눌러 보자. 미리 적어 둔 표에 같은 해시가 있으면 비밀번호가 드러나고, 표에 없으면 짐작이 막혀요.

표에 있는 해시와 같은 것은 옆 칸의 비밀번호가 그대로 드러났고, 표에 없는 해시는 짐작이 막혔다. 위험의 뿌리는 같은 비밀번호가 언제나 같은 해시가 된다는 점이에요.
그러면 막는 길도 보인다. 같은 비밀번호라도 사람마다 해시가 달라지게 만들면 미리 만든 표 하나로는 더 이상 맞출 수 없다. 그 방법이 솔트다.

03

비밀번호에 솔트를 더해요

솔트는 사람마다 무작위로 정한 짧은 값이다. 가입할 때 새로 만들고, 비밀번호를 그대로 해시하는 대신 그 사람의 솔트를 붙여 둘을 합친 것을 해시해요.
솔트는 숨겨야 하는 비밀이 아니어서 해시 옆에 함께 저장해 둔다. 로그인할 때 같은 솔트를 다시 붙여야 같은 지문이 나오기 때문이다. 솔트가 하는 일은 하나, 사람마다 해시를 다르게 만드는 것이다.

사람 A
apple+ __=apple
해시1f8ba
사람 B
apple+ __=apple
해시1f8ba
아직 비밀번호만 해시했어요

솔트 더하기 버튼을 눌러 보자. 두 사람의 비밀번호는 같지만 솔트가 달라서 합친 입력과 해시가 서로 달라져요.

솔트를 더하자 해시에 들어가는 입력이 달라졌다. 같은 비밀번호라도 붙은 솔트가 다르면 재료가 달라지고, 해시는 입력이 조금만 달라도 결과가 완전히 바뀐다. 그러니 솔트가 다르면 해시도 달라질 수밖에 없어요.
이제 같은 비밀번호를 쓰는 두 사람의 저장된 해시가 어떻게 보이는지 솔트를 껐다 켜며 견줘 보자.

04

같은 비밀번호도 다른 해시가 돼요

솔트가 없을 때는 같은 비밀번호 두 개의 해시가 똑같았다. 솔트를 켜면 두 사람의 비밀번호가 같아도 저장된 해시는 서로 다르다. 이제 해시 목록을 봐도 같은 비밀번호를 쓰는 사람을 골라낼 수 없어요.
미리 만든 표도 힘을 잃는다. 그 표는 솔트 없는 비밀번호로 만든 것이라 솔트가 섞인 해시와는 맞지 않는다. 표를 쓰려면 솔트마다, 곧 사람마다 표를 새로 만들어야 하니 사실상 쓸모가 없어진다.

저장된 해시
사람 A1f8baapple
사람 B1f8baapple
미리 만든 표표가 들어맞아 위험
같은 비밀번호라 해시가 똑같아요

솔트를 껐다 켜며 견줘 보자. 끄면 같은 비밀번호가 같은 해시가 되고, 켜면 같은 비밀번호도 해시가 달라져 미리 만든 표가 들어맞지 않아요.

솔트를 켜자 같던 두 해시가 서로 다른 값으로 갈라졌고, 미리 만든 표도 더는 들어맞지 않았다. 작은 한 꼬집이 두 가지를 한꺼번에 막은 셈이에요. 저장된 해시로 같은 비밀번호를 알아내는 일과 표로 흔한 비밀번호를 거꾸로 찾는 일이다.
다만 솔트가 모든 것을 막지는 못한다. 한 사람만 노려 그 사람의 솔트를 붙인 흔한 비밀번호를 하나씩 넣어 보는 공격은 여전히 가능하다. 그래서 솔트는 일부러 느린 해시, 그리고 쉽게 짐작할 수 없는 긴 비밀번호와 함께 써야 한다.

05

정리

정리하면 이렇다. 같은 비밀번호는 같은 해시가 되므로, 저장된 해시로 같은 비밀번호를 알아낼 수 있고 미리 만든 표로 흔한 비밀번호를 거꾸로 찾아낼 수 있다. 이것을 막으려면 사람마다 다른 무작위 솔트를 비밀번호에 붙여 해시한다.
솔트는 비밀이 아니라 사람마다 다르기만 하면 된다. 솔트를 더하면 같은 비밀번호도 해시가 달라져 미리 만든 표가 힘을 잃어요.

핵심을 차례로 눌러요

핵심을 차례로 눌러 되짚어 보자. (같은 비밀번호는 같은 해시 → 미리 만든 표의 위험 → 사람마다 솔트를 더함 → 같은 비밀번호도 다른 해시)

이제 같은 비밀번호가 왜 함정이 되는지, 한 꼬집의 솔트가 그 함정을 어떻게 막는지 알았다. 새로운 비밀을 숨기지 않고도 사람마다 값을 다르게 만드는 것만으로 방어가 단단해진다는 점이 흥미롭다.
지금까지는 비밀번호를 안전하게 저장하는 법을 봤어요. 그런데 비밀번호 하나로 나를 증명하는 것으로 충분할까? 비밀번호 말고도 나임을 보여 주는 여러 방법을 다음 레슨 인증에서 다룬다. 비밀번호는 내가 아는 것일 뿐이고, 내가 가진 것과 나 자신의 특징도 증명에 쓰인다.

한 줄 정리같은 비밀번호는 같은 해시가 된다. 그래서 저장된 해시만 봐도 같은 비밀번호를 쓰는 사람을 알 수 있고, 흔한 비밀번호와 그 해시를 미리 적어 둔 표로 원래 비밀번호를 찾아낼 위험이 생겨요. 막는 방법은 사람마다 다른 무작위 값을 비밀번호에 붙인 뒤 해시하는 것이다. 이 값을 솔트라고 부른다. 솔트는 비밀이 아니어서 해시 옆에 함께 저장하고, 사람마다 다르기만 하면 된다. 솔트를 더하면 같은 비밀번호도 해시가 달라져 미리 만든 표가 들어맞지 않는다. 다만 한 사람을 노려 비밀번호를 하나씩 넣어 보는 공격까지 막지는 못하므로, 느린 해시와 긴 비밀번호를 함께 써야 해요.
← 보안
이 페이지가 도움 됐다면 후원하기