어떻게 되돌릴 수 없게 바꾸기, 해시
믹서에 과일을 넣고 갈면 주스가 나온다. 주스만 보고 어떤 과일이 얼마나 들어갔는지 정확히 되돌려 놓을 수는 없어요. 보안 해시도 비슷하다. 어떤 값을 넣으면 짧은 지문이 나오는데, 지문을 보고 원래 값을 거꾸로 계산해 낼 수 없다. 그래서 서비스는 비밀번호를 그대로 저장하지 않고 이 지문만 저장한다.
한 방향으로만 가요
어떤 값을 넣든 정해진 길이의 짧은 지문을 돌려주는 계산이 있다. 이것을 보안 해시라고 부른다. 같은 값을 넣으면 언제나 같은 지문이 나오고, 글자 하나만 바꿔 넣어도 지문은 완전히 딴판이 돼요.
가장 중요한 성질은 방향이다. 입력에서 지문을 만드는 것은 쉽지만, 지문에서 원래 입력을 거꾸로 계산해 내는 방법은 없다. 과일은 주스가 되지만 주스는 과일로 돌아가지 않는 것과 같다. 그래서 한 방향 함수라고 부른다.
지문 만들기 버튼으로 입력을 지문으로 바꿔 보자. 그다음 되돌리기를 누르면 길이 막혀 있어요.
앞으로 가는 길은 쉽게 열렸지만 거꾸로 가는 길은 막혀 있었다. 이 막힘이 보안 해시의 핵심이다. 지문만 가지고는 원래 값을 곧장 알아낼 수 없기 때문이에요.
이 성질을 가장 흔히 쓰는 곳이 비밀번호다. 비밀번호를 그대로 저장해 두면 저장소를 들여다본 사람이 곧바로 알게 된다. 그래서 다른 방법을 쓴다.
비밀번호 대신 지문을 저장해요
비밀번호를 글자 그대로 저장하는 것을 평문 저장이라고 한다. 이렇게 두면 저장소가 털리거나 누가 들여다보기만 해도 모든 사용자의 비밀번호가 드러난다. 많은 사람이 같은 비밀번호를 여러 곳에 쓰기 때문에 피해는 다른 서비스로까지 번져요.
그래서 비밀번호는 해시에 넣어 나온 지문만 저장한다. 저장소에는 되돌릴 수 없는 지문만 줄지어 있게 된다.
평문 저장과 지문 저장 버튼을 눌러 비교해 보자. 평문 저장에서는 비밀번호가 그대로 보이고, 지문 저장에서는 되돌릴 수 없는 지문만 남아요.
평문으로 저장한 쪽은 비밀번호가 훤히 보였고, 지문으로 저장한 쪽은 알아볼 수 없는 지문만 남았다. 다만 지문이 있다고 완전히 안심할 수는 없어요. 공격자가 지문을 거꾸로 계산하지는 못해도, 흔한 비밀번호를 하나하나 해시에 넣어 같은 지문이 나오는지 맞춰 볼 수는 있기 때문이다.
그래서 비밀번호용 해시는 일부러 계산을 느리게 만들어 이런 대입 시도를 어렵게 한다. 그런데 비밀번호를 저장하지 않는다면, 로그인할 때 맞는지는 어떻게 확인할까?
입력을 지문으로 바꿔 확인해요
같은 값을 넣으면 늘 같은 지문이 나온다는 성질을 확인에 쓴다. 로그인할 때 사용자가 비밀번호를 입력하면, 서버는 그 입력을 다시 해시에 넣어 새 지문을 만들어요. 그리고 새 지문을 저장해 둔 지문과 견준다.
둘이 같으면 같은 비밀번호를 넣은 것이니 통과시키고, 다르면 막는다. 원래 비밀번호를 꺼내 볼 필요 없이 지문끼리만 견줘서 확인하는 것이다.
입력을 하나 고르고 확인하기를 눌러 보자. 입력의 지문이 저장된 지문과 같으면 통과하고, 다르면 막혀요.
맞는 비밀번호를 넣었을 때만 지문이 같아 통과했다. 숫자 하나만 다른 비밀번호도 전혀 다른 지문이 되어 막혔어요. 저장은 지문만, 확인은 지문끼리 비교, 이렇게 원본 없이도 맞고 틀림을 가려낸다.
해시는 비밀번호 말고도 쓰인다. 내려받은 파일의 지문을 공개된 지문과 견주면 파일이 오는 동안 바뀌지 않았는지 확인할 수 있다. 앞 레슨에서 본 무결성을 지키는 수단이다.
데이터 영역의 해시와는 목적이 달라요
해시라는 말은 데이터 영역에서도 나왔다. 거기서는 값을 칸 번호로 바꿔 원하는 자료를 빨리 찾는 데 썼어요. 빠르고 고르게 자리를 정하는 것이 목적이었고, 가끔 두 값이 같은 칸에 들어가도 크게 문제 되지 않았다.
보안 해시는 모양은 비슷해도 목적이 다르다. 지문에서 원래 값으로 돌아갈 수 없어야 하고, 같은 지문이 나오는 서로 다른 두 입력을 찾아내기도 사실상 불가능해야 한다.
양쪽을 눌러 두 해시의 목적을 견줘 보자. 데이터 영역의 해시는 빨리 찾기, 보안 해시는 되돌릴 수 없게 하기가 목적이에요.
이름은 같은 해시라도 데이터 영역에서는 빨리 찾으려고, 보안에서는 되돌릴 수 없게 하려고 쓴다. 목적이 그 도구에 필요한 성질을 정해요.
이처럼 이름이 같은 도구라도 어디에 쓰느냐에 따라 중요한 성질이 달라진다. 보안에서는 되돌릴 수 없다는 점이 가장 소중해요. 이제 처음부터 끝까지 정리해 보자.
정리
정리하면 이렇다. 보안 해시는 입력을 한 방향 지문으로 바꾸고, 지문에서 입력으로는 되돌아갈 수 없다. 그래서 비밀번호 자체가 아니라 지문만 저장해요. 로그인할 때는 입력을 다시 지문으로 바꿔 저장된 지문과 견주고, 같으면 통과시킨다.
이것은 빨리 찾으려고 쓰는 데이터 영역의 해시와 달리 되돌릴 수 없게 하려고 쓰는 해시다.
핵심을 차례로 눌러 되짚어 보자. (한 방향 지문 → 지문만 저장 → 입력의 지문으로 확인 → 데이터 영역의 해시와 목적이 다름)
이제 비밀번호를 그대로 두지 않고도 지키는 방법을 알았다. 되돌릴 수 없는 지문 하나가 저장과 확인을 함께 안전하게 해 줘요. 원본을 아무도 들고 있지 않으니 새어 나갈 비밀도 줄어든다.
그런데 남은 약점이 있다. 같은 비밀번호는 늘 같은 지문이 되므로 두 사람이 같은 비밀번호를 쓰면 지문도 같아지고, 흔한 비밀번호의 지문 목록을 미리 만들어 둘 수도 있다. 이 약점을 막는 솔트를 다음 레슨에서 다룬다.