Hashing
◎ 해싱
-> 어떤 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것
-> 클라이언트에서 id와 비밀번호를 통해 서버에 요청을 하면 서버에서 비밀번호를 한번 암호화하여 db에 저장된 정보와 대조를 한다. 이때 db는 원본 비밀번호를 그대로 저장하지 않고, 암호화된 비밀번호를 저장한다.
-> 다음은 해싱의 원칙이다.
1. 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야 한다. : 해시값 만드는데 많은 시간이 걸리면 클라이언트는 그만큼의 시간을 응답을 받기 위해 기다려야 한다.
2. 최대한 해시 값을 피해야 하고, 모든 값은 고유한 해시 값을 가진다. : 해싱은 어떠한 알고리즘을 통해 요청 받은 문자열을 완전히 다른 문자열로 변환하는데 이 때 똑같은 해시 값을 가지는 경우가 존재하기도 한다. 이런 상황이 최대한 일어나지 않도록 하는 알고리즘을 이용해 해싱을 한다.
3. 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 한다. : 예를 들어 Code에서 code로 대문자를 소문자로만 바꿨음에도 이 둘은 완전히 다른 해시값을 가져야 한다. 그래야 해시 값을 추측하여 알아내는 것을 막을 수 있다.
◎ Salt
-> 암호하해야 하는 값에 어떠한 '별도의 값'을 추가하여 결과를 반영하는 것이다.
-> 해싱은 결과가 항상 같기 때문에 해시 값과 원본 값을 대조하는 테이블이 있다면 정보를 알아낼 수도 있다. 따라서 요청 받은 기존 문자열에 salt를 추가하여 해싱을 하면 좀 더 안전하게 데이터를 보호할 수 있다.
-> 기존 문자열 + salt => 해싱 = 암호화 된 값
-> 다음은 salt 사용시 주의점이다.
1. salt는 유저와 패스워드 별로 유일한 값을 가져야 한다.
2. 사용자 계정을 변경할 때, 비밀번호를 변경할 때 마다 새로운 임의의 salt를 사용해서 해싱한다. : salt를 그대로 사용하면 데이터를 유추할 수도 있다.
3. Salt는 절대로 재사용해서는 안된다.
4. Salt는 DB의 유저 테이블에 같이 저장되어야 한다.