사전공격
사전공격(dictionary attack)은 사전 대입 공격이라고도 불리며, 사전에 있는 단어를 입력하여 암호를 알아내거나 해독하는 컴퓨터 공격법이다. 암호를 알아내기 위한 공격은 사전의 단어를 순차적으로 입력하는 것이다. 단어를 그대로 입력할 뿐 아니라, 대문자와 소문자를 뒤섞기도 하고, 단어에 숫자를 첨부하기도 하는 등의 처리도 병행하면서 공격을 할 수 있다.
개요
사전공격은 수십만 개의 단어가 수록된 사전을 컴퓨터에 자동 처리시킴으로써 짧은 시간 안에 모든 단어를 입력할 수 있기 때문에 사전공격은 기본적인 패스워드 탐색의 수법으로 이용된다. 이에 대처하기 위해서는 인명이나 의미가 있는 단어를 패스워드로 쓰지 말아야 하며, 기호나 숫자 등을 랜덤으로 결합하는 방법을 사용해야 한다. 암호해독의 수법으로 사전공격을 이용하는데, 사서에 있는 단어나 무작위로 모은 평문을 모두 암호화하여 이것을 해독하고자 하는 암호에 맞춰보고 일치 여부를 조사하는 방법을 쓴다. 이에 대한 대처법으로는 암호문을 길게 하는 것이 효과적이다. 사전공격은 무차별 대입 공격(Brute Force Attack)보다 적은 시도로 비밀번호를 크랙할 수 있는 장점이 있다.
사전 파일
사전공격으로 비밀번호를 대입할 때 사전 대량적인 비밀번호 목록이 필요하다. 이 비밀번호 목록은 사전 파일인 txt 파일에 포함되어 있다. 사전 파일은 문자와 숫자의 가능한 조합을 수집하여 비밀번호 목록에 나열한다. 이 프로그램은 자동으로 비밀번호를 하나씩 매우 빠른 속도로 시도한다. 사전공격은 사전 파일을 사용하기 때문에 용량이 클수록 유리하다. [1]
대안 방법
솔팅(Salting)
솔트(Salt)는 단방향 해시 함수에서 다이제스트를 생성할 때 추가되는 바이트 단위의 임의의 문자열이다. 그리고 이 원본 메시지에 문자열을 추가하여 다이제스트를 생성하는 것이 솔팅(Salting)이다. 솔트는 암호학적으로 안전한 의사 랜덤 생성기(CSPRNG, Cryptographically Secure Pseudo Random Number Generator)를 사용해 생성되어야 한다. 예를 들어, " redflOwer"에 솔트인 "8zff4fgflgfd93fgdl4fgdgf4mlf45p1"를 추가해 다이제스트를 생성한다. 이 방법을 이용하면 공격자가 "redflOwer"의 다이제스트를 알아내더라도 솔팅된 다이제스트를 대상으로 패스워드 일치 여부를 확인하기 어렵다. 또한 사용자별로 다른 솔트를 이용한다면 같은 패스워드를 사용하는 사용자의 다이제스트가 다르게 생성되어 인식 가능성 문제가 크게 개선된다.[2] 솔트는 보통 사용자 계정 데이터베이스에 해시와 같이 저장되거나, 해시 문자열 그 자체의 일부를 사용한다. 또한, 솔트는 비밀일 필요가 없다. 임의로 해시를 하는 것만으로도, 룩업 테이블, 역 룩업 테이블, 레인보우 테이블은 효과가 없어진다. 공격자는 솔트가 어떤 것이 될지 미리 알 수 없고, 그렇기 때문에 공격자는 룩업 테이블이나 레인보우 테이블을 사전에 계산해둘 수 없다. 만약 각각의 사용자의 비밀번호가 다른 솔트로 해시 된다면, 리버스 룩업 테이블 공격 또한 작동하지 않는다.[3]
잘못된 사용 방법
- 솔트 재사용 : 일반적인 실수는 같은 솔트를 각각의 해시에 사용하는 것이다. 어느 솔트는 프로그램 내에 하드 코딩되어 있거나 랜덤으로 한번 생성해서 사용하기도 한다. 만약 두 사용자가 같은 비밀번호를 사용할 경우 그들은 여전히 같은 해시값을 가진다면 이러한 방법은 비효율적이다. 해커들은 여전히 역 룩업 테이블을 사용해 사전 공격을 모든 해시에 동시에 시도할 수 있다. 해커들은 비밀번호를 해싱하기 전에 사용될만한 솔트들을 추가한 후 해싱을 한다. 만약 솔트가 유명한 제품의 이름으로 되어 있으면 룩업 테이블과 레인보우 테이블은 이 솔트를 사용해 만들어서 비밀번호를 쉽게 얻어 낸다. 사용자 계정을 새로 만들거나 비밀번호를 변경할 때는 반드시 랜덤으로 생성된 솔트를 사용해야 한다.[4]
- 짧은 솔트 : 만약 솔트가 짧다면 해커는 가능한 솔트들을 활용해 룩업 테이블을 만들 수 있다. 례를 들어, 만약 솔트가 아스키 문자 3자로 되어있다면 솔트 값으로 95*95*95 = 857,375개의 값이 사용할 수 있다. 이 값이 많아 보일 수도 있지만 각각의 룩업 테이블이 1MB의 일반적인 비밀번호로 구성된 경우 837G만으로 전체 룩업 테이블을 구성할 수 있고 요즘 1,000GB 하드 디스트는 채 100달러도 하지 않는다. 동일한 이유로 사용자 이름 역시 솔트로 사용할 수 없다. 혼자 독립적으로 운영되는 서비스의 경우는 사용자 이름이 유니크할 수 있지만 다른 서비스에서도 똑같이 자주 사용한다. 해커들은 평범한 사용자 이름을 사용해 룩업 테이블을 구성하고 이를 사용해서 사용자 이름이 솔트로 사용된 해시값을 생성한다. 해커가 사용 가능한 솔트를 가지고 룩업 테이블을 생성하는 것을 불가능하게 하려면 솔트는 반드시 길게 만들어야 한다. 좋은 방법은 해시 함수를 사용해 생성된 길이와 동일하게 만드는 것이다. 예를 들어 해시값이 SHA256으로 생성한다면 솔트 역시 랜덤으로 생성된 32바이트로 만들면 된다. [4]
각주
- ↑ Jenefey Aaron, 〈Dictionary File이란 무엇이며 Dictionary File을 사용하여 비밀번호를 어떻게 복구합니까?〉, 《TENORSHARE》, 2014-03-04
- ↑ 김종수, 〈안전한 패스워드 저장〉, 《네이버 D2》, 2013-03-25
- ↑ NekhBet, 〈Salted Password 해싱 - 올바르게 하기(1)〉, 《네이버 블로그》, 2015-03-10
- ↑ 4.0 4.1 이누엘, 〈비밀번호 해시에 소금치기 - 바르게 쓰기〉, 《티스토리》, 2014-05-23
참고 자료
- Jenefey Aaron, 〈Dictionary File이란 무엇이며 Dictionary File을 사용하여 비밀번호를 어떻게 복구합니까?〉, 《TENORSHARE》, 2014-03-04
- 김종수, 〈안전한 패스워드 저장〉, 《네이버 D2》, 2013-03-25
- 이누엘, 〈비밀번호 해시에 소금치기 - 바르게 쓰기〉, 《티스토리》, 2014-05-23
- NekhBet, 〈Salted Password 해싱 - 올바르게 하기(1)〉, 《네이버 블로그》, 2015-03-10
같이 보기