Hash

  • hash,  hash값 : hash 알고리듬으로 생성된 값
  • hash 알고리듬: hash를 생성하는 알고리듬

예를 들어 12345라는 값을 어떠한 hash 알고리듬을 사용해서 hash를 생성하면 abc라는 값이 된다고 합시다. hash 알고리듬도 일반 함수와 마찬가지로 입력값이 있고, 그 값을 계산하는 알고리듬이 있고, 결과값이 생성되는 것은 같죠. 하지만 hash의 특별한 점은 결과값과 알고리듬을 알아도 원래 입력값을 알 수 없다는 점입니다.

function func(inputNum) {
  var result = inputNum+10;
  return result;
}

이라는 일반 함수를 봅시다. 이 함수에 1을 넣으면 11이 return되고, 123을 넣으면 133이 return됩니다. 또한 11이라는 결과값과 위 함수의 구조(알고리듬)을 알고 알고 있으면 역으로 1이라는 입력값을 얻을 수 있습니다.

function hashFunc(inputNum) {
  var str = inputNum.toString();
  var result = str[0] + str[str.length-1];
  return result;
}

이 hash 알고리듬 함수는 입력된 값의 첫번째 자리 값과 마지막자리 값만 리턴합니다. 1을 넣으면 11이 return되고 123을 넣으면 13이 return이 됩니다. 이 함수는 첫번째 함수와 다르게 11이라는 결과값과 위 함수의 구조(알고리듬)을 알고 있더라도 입력값이 반드시 1이라고 할 수 없습니다. 입력값이 1, 11, 121, 132341인 경우에도 같은 결과 값을 return하기 때문이죠.

이처럼 hash값은 알고리듬을 알고 있더라도 원래의 data로 복원이 불가능합니다. 물론 실제 hash알고리듬은 훨씬 복잡하고, 동일한 결과값이 쉽게 나오지 않습니다.

Hash로 사용자 암호를 저장하고 로그인에 활용하는 법을 살펴봅시다. 로그인을 위해서 user1이라는 ID와 password1이라는 암호가 필요하다고 가정하면, DB에는 password1을 저장하지 않고  password1의 hash값을 생성하여 저장합니다. 사용자가 로그인을 하려고 password1을 입력하면, 서버는 password1에 대한 hash를 생성하고 이 값과 DB에 저장되어 있는 값이 같은 지를 비교하여 같으면 로그인이 성공하게 됩니다.

대형사이트 해킹시 뉴스에서 담당자 인터뷰때 항상 나오는 말이 "해킹 당한 비밀번호들은 암호화되어 있으므로 안전하다"는 것인데요, 이는 진짜 비밀번호가 유출된 것이 아니라 비밀번호의 hash가 유출된 것이기 때문입니다. 애초에 이 웹사이트들은 실제 비밀번호를 저장하고 있지 않습니다. hash값은 원래값으로 되돌릴 수 없게 되어 있기때문에 해커가 암호화된 비밀번호와 해당 hash의 알고리듬을 알고 있다고 해도 이 알고리듬을 사용해서 원래의 비밀번호를 얻는 것은 불가능합니다.

그러면 해커에게 털린 내 비밀번호 hash는 정말 안전할까요? 그건 아닙니다. 해커가 알고리듬을 사용해서 비밀번호를 얻는 것은 불가능 하지만, 해당 비빌번호와 일치하는 hash값이 나올때까지 해당 알고리듬을 반복하면 언젠가는 이 값을 얻을 수 있기때문입니다. 그래서 대형사이트 해킹 뉴스에서 항상 따라 나오는 말이 "하지만 최대한 빨리 비밀번호를 바꿔야 한다"입니다.

댓글

이수혁 2018.07.19
이건 잘 이해가 안됩니다. 그래도 이해하려고 노력하겠습니다. 
I
Ian H 2018.07.23
@이수혁,
좀 더 이해하기 쉽게 내용을 수정하였습니다. 혹시나 이해 안되는 부분이 있으면 질문해 주세요
댓글쓰기

이 글에 댓글을 다시려면 SNS 계정으로 로그인하세요. 자세히 알아보기

UP