우리는 평소 네이버에 접속하거나, 게임에 접속하거나 등등을 위해 아이디와 비밀번호를 만든다.
예를 들어, 게임에 접속하기 위해 회원가입 한 아이디와 비밀번호를 입력하면,
해당 게임의 서버에서 데이터베이스에 저장되어 있는 유저의 아이디와 비밀번호를 비교해서,
접속이 가능하도록 하는 것이다.
만약 제3자가 중간에 내 아이디와 비밀번호를 탈취한다면 어떻게 될까?
해당 정보를 악용해 내 개인정보들이 털리는 것이다..!
따라서 탈취가 되더라도 해독이 가능하지 않도록 아이디와 패스워드의 암호화가 필요한 것이다.
"Hashing" 은
어떠한 문자열에 임의의 연산을 적용하여 다른 문자열로 변환하는 것이다.
단,
1. 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야 한다.
2. 최대한 해시 값을 피해야 하며, 모든 값은 고유한 해시 값을 가진다.
3. 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 한다.
Salt란,
암호화해야 하는 값에 어떤 '별도의 값'을 추가하여 결과를 변형하는 것이다.
Salt는 왜 존재하나?
1. 동일 문자의 Hashing의 결과는 늘 동일하기 때문에 디코딩해버리는 경우도 생긴다.
2. Salt가 있다면 기존 해시값과 전혀 다른 해시값이 반환되어 알고리즘이 노출되더라도 원본값을 보호할 수 있다.
3. 기존: (암호화 하려는 값) => (hash 값) / Salt 사용: (암호화 하려는 값)+(Salt용 값) => (hash 값)
Salt 사용 시 주의할 점
1. 유저와 패스워드 별로 유일한 값을 가져야 한다.
2. 사용자 계정을 생성할 때와 비번을 변경할 때 마다 새로운 임의의 Salt를 사용해서 해싱해야 한다.
3. 절대 재사용하지 말아야 한다.
4. DB의 유저 테이블에 같이 저장되어야 한다. => 유저가 비번을 입력했을 때, 이 유저만의 Salt와 합해서 해싱을 해줄 수 있기 때문.