솔트? 소금?
출처: hospitality
솔트(salt)란 단방향 해시 함수에서 원본 데이터를 복원하기 어렵도록 암호화 하기 전에 임의로 추가하는 데이터를 의미한다.
음식에 소금을 뿌릴 때마다 맛이 조금씩 바뀌는 것과 비슷한 개념으로 salt 라는 단어를 사용한다.
단방향 해시 함수?
단방향 해시 함수는 입력값을 문자와 숫자로 이루어진 일정한 길이로 데이터를 생성하는 함수이다. 해시 함수를 거친 암호화된 데이터를 다이제스트(digest)라 한다.
해시 함수는 단방향이기 때문에 암호화는 가능하지만, 복호화는 불가능해서 원본 데이터를 알 수 없다. 이러한 특징 때문에 패스워드를 저장할 때 원본을 저장하지 않고 단방향 암호화된 다이제스트를 저장하는 것이 보편화 되었다.
단방향 해시 함수의 한계
하지만 이렇게 암호화 되었다고 해도 공격으로부터 안전한 것은 아니다.
우선, 단방향 해시 함수는 동일한 값(Input)을 넣으면 동일한 결과값(Output)을 반환하기 때문에 생성 가능한 모든 다이제스트과 비교하여 원본 메시지를 찾을 수 있다. 이와 같은 다이제스트 목록을 레인보우 테이블(rainbow table)라 하며, 이를 사용한 공격을 레인보우 공격(rainbow attack)이라 한다.
다음으로 해시 함수는 원래 패스워드를 저장하기 위해 설계된 것이 아닌 짧은 시간에 데이터를 검색하기 위해 설계된 것이다. 그렇기 때문에 공격자는 해시 함수의 빠른 처리 속도 덕분에 매우 빠른 속도로 임의의 문자열의 다이제스트를 해킹할 대상의 다이제스트와 비교할 수 있다. (MD5를 사용하면 1초당 56억 개의 다이제스트를 대입할 수 있다고 한다.)
단방향 해시 함수 보완하기
솔팅(salting)
솔트(salt)는 단방향 해시 함수에서 다이제스트를 생성할 때 추가되는 바이트 단위의 임의의 문자열이다. 이를 원본 데이터에 추가하여 다이제스트를 생성하는 것을 솔팅(salting)이라 한다.
이 방법을 사용하면 공격자가 원본 데이터의 다이제스트를 알아내더라도, 솔팅된 다이제스트를 대상으로 패스워드 일치 여부를 확인하기 어려워진다.
또한, 사용자마다 다른 솔트를 사용한다면 동일한 패스워드를 사용자의 다이제스트가 다르게 생성되어 쉽게 원본을 확인할 수 없게 된다.
키 스트레칭(key stretching)
키 스트레칭은 해시 함수를 여러 번 수행하는 방법이다. 즉, 생성된 다이제스트를 다시 입력값으로 넣어 해시 함수를 실행하는 것이다.
이 방법은 동일한 횟수만큼 해시를 수행해야만 입력한 패스워드와 일치 여부를 확인할 수 있다.
참고자료
- 안전한 패스워드 저장 [naver d2]