Salt (hash)

해시함수를 돌리기 전에 원문에 임의의 문자열을 덧붙이는 것. 단어 뜻 그대로 원문에 임의의 문자열을 붙인다는 의미라, 소금친다 라고 해석할 수 있다.

A.1) 필요한 이유

Salt 는 단방향 해시 함수의 단점을 보완하기 위해 필요한 방식이다.

salt 방식 외에도 key stretching 이 있다. Key stretching 이란, 브루트포스를 최대한 무력화 하기위한 방법으로, 원문을 통해 얻어진 digest 를 한번 더 기존 Hash 에 넣어서 두번째 digest 를 얻는 방법이다.

단방향 해시 함수는 다음 그림과 같다.

B) 단방향 해시 함수의 단점

  • 일반적인 해시 함수의 경우, 동일한 메시지는 동일한 다이제스트를 갖는다는 문제가 있다.
  • 이러한 문제를 활용해서 해싱된 메시지의 원문을 찾기 위한 가장 간단한 방법은 바로, 해커들이 여러 값들을 대입해보면서 얻었던 다이제스트들을 모아놓은 리스트에서 찾아보는 것이다.
    • 이러한 다이제스트들의 테이블을 레인보우 테이블 (Rainbow Table) 이라고 한다.
  • 이렇게 사용자들이 많이 사용하는 password 나 복잡하지 않은 암호의 경우 이미 공격자들이 대입해보았을 확률이 높다.
  • 그리고 대입해 볼 확률이 높다는 것은 즉, 이미 해당 패스워드의 다이제스트가 레인보우 테이블에 있을 가능성이 높다는 것이다.

C) Salt 를 추가하면 좋은 점

  • 설령 다이제스트를 알아낸다 하더라도 password 를 알아내기 더욱 어려워진다.
    • 더욱이 솔트는 임의의 문자열이기 때문에 Rainbow Table 에 없을 가능성이 매우 높아진다.
    • 즉, salt 의 가장 큰 목적은 해당 salt 의 레인보우 테이블 새로 생성하여 만들기 위해서는 엄청나게 큰 데이터를 필요로 하기 때문에 자연스럽게 레인보우 테이블 생성을 방지하는 역할을 해주기도 한다.
  • 그리고 사용자마다 다른 Salt 를 사용한다면 설령 같은 비밀번호더라도 다이제스트의 값은 다르다.
    • 이는 결국 한 명의 패스워드가 유출되더라도 같은 비밀번호를 사용하는 다른 사용자는 비교적 안전하다는 의미기도 하다.

D) References