Hashing 이란 무엇일까?
Hashing은 암호화 기법 중 하나라고 할 수 있다.
암호화는 그럼 무엇이냐? 특정 주체만 접근할 수 있게 풀기 어려운 알고리즘을 구현하는 것이라고 할 수 있다.
Hashing의 대표적인 예로는 SHA-256 알고리즘이 있다.
SHA-256은 SHA(Secure Hash Algorithm) 알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다.
해시 알고리즘 SHA-2 계열 중 하나이며, 2^256만큼 경우의 수를 만들 수 있다.
( 1비트는 0과 1의 2가지 정보를 만들 수 있고 n비트는 2의 n승 정보를 만들 수 있다 )
암호화가 중요한 이유는 해커가 DB에 접근해서 특정 개인의 패스워드를 취득했을 때 그 패스워드를 이용하여 해당사이트 뿐만 아니라 타사이트에서도 도용이 가능하기 때문이다. 우리네 대부분은 비밀번호를 통일시켜놓는 경향이 있기에 큰 피해가 발생할 수 있다.
아래와 같이 어떠한 암호화 시스템도 없이 서버에서 바로 DB에 저장한다면 혹여나 해커가 접근해서 패스워드를 취득했다고 치면 이것은 순수한 PW이기에 다른 사이트에서도 사용이 가능할지 모른다.
하지만 아래와 같이 간단하게라도 비밀번호를 암호화 하여 저장한다면 온전한 PW 유출을 막을 수 있고 DB에서 취득한 비밀번호로 재로그인 했을 때 로그인이 되지 않을 것이다.
DB에 저장된 값은 서버에서 해싱을 통해 만들어진 값이기에 DB에서 탈취한 값으로 서버에 로그인 한다면 새로운 해쉬값이 생성되어 DB측 데이터와 같은 값이 나오지 않게 된다.
아래는 해쉬의 예시이다. 해쉬를 진행하면 안전성이 높아질 것만 같지만 꼭 그렇지도 않다. 왜냐하면 같은 값에는 항상 같은 해쉬값이 추출되기 때문이다.
예를 들어 1234라는 값을 해쉬해서 'abcde'라는 값이 나온다고 치자. 그러면 1234의 해쉬값은 abcde라고 웹상에 퍼져있을 확률이 높다.
이렇게 사용자들이 자주 사용하는 비밀번호의 해쉬값을 모아놓은 표를 'rainbow table' 이라고 하는데 이를 통해 해커들이 해쉬값을 쉽게 디코딩할 수 있게 된다.
https://crackstation.net/ --- 해쉬 디코딩 사이트
때문에 우리는 hashing 전에 임의의 값을 집어넣고 hashing하여야 한다. 즉, 이중 암호화를 진행한다고 보면 된다.
예를 들어 김코딩이라는 사람이 A, B 사이트에 같은 비밀번호로 회원가입을 하고 이 두 사이트 모두 salt 시스템이 있다고 치자.
그러면 비밀번호가 '1234'로 회원가입할 때 A 싸이트에서는 '1234'에 'pie'라는 임의의 값을 집어넣어 해싱해서 '123jkdfa'라는 값이 나오고 B 사이트에서는 '1234'에 'burger'라는 임의의 값이 들어가 해싱되어 '56791gky' 나올 것이다. 이는 각각의 DB에 같은 pw지만 저장되는 해쉬값의 불일치를 만들고 만약 두 사이트 모두 DB가 해킹되었을 때 일말의 규칙성도 없어보이게 만들어 비밀번호 유출 가능성을 낮출 수 있게 된다.
salt 시스템이 없다면 '1234'의 해쉬값은 동일하므로 해커들에게 어떠한 규칙성을 제공할지도 모르기 때문에 보안성이 낮아진다.