- 단순 텍스트
- 단방향 해시 함수(one-way hash function)의 다이제스트(digest)
- 키 스트레칭
- 솔팅
- 단방향 해시 함수 : 특정 알고리즘을 이용하여 데이터를 암호화된 데이터로 변환시켜준다.
- 이러한 해시 변환을 통해 암호화된 데이터를 다이제스트라고 부른다.
- 원본 메시지를 알면 암호화된 메시지를 구하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구할 수 없어야 하며 이를 '단방향성'이라고 한다.
- 예시
- 패스워드가 "hunter2"라면 해시 알고리즘인 "SHA-256"으로 인코딩하면
f52fbd32b2b3b86ff88ef6**c**490628285f482af15ddcb29541f94bcf526a3f6**c**7
로 변환- 사용자가 로그인할 때 패스워드를 입력하면, 이를 해시한 값을 저장된 값과 비교하여 일치 여부를 확인할 수 있다.
- avalanche 효과
- 입력 값의 일부가 변경되었을 때 다이제스트가 완전히 달라지도록 설계되어 있다.
- "hunter3"와 "hunter2"의 해시값은 완전히 다르다.
- 문제점
- 인식 가능성(recognizability)
- 동일 메세지는 동일한 다이제스트 값을 가진다. ⇒ 원본 유추 가능
- 레인보우 공격(rainbow attack) : 공격자가 전처리(pre-computing)된 다이제스트를 가능한 한 많이 확보한 다음 이를 탈취한 다이제스트와 비교해 원본 메시지를 찾아내거나 동일한 효과의 메시지를 찾을 수 있다.
- 이와 같은 다이제스트 목록을 레인보우 테이블(rainbow table)이라 하고, 이와 같은 공격 방식을 레인보우 공격(rainbow attack)이라 한다.
- 속도(speed)
- 해시 함수는 원래 암호화가 아닌 데이터 검색을 빠르게 하기 위해 설계된 것
- 해시 함수의 빠른 처리 속도로 인해 공격자는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교할 수 있다.
- 인식 가능성(recognizability)
- 여러 단계의 해시 함수를 적용하여 다이제스트를 생성하는 과정
- 잘 설계된 패스워드 저장 시스템에서는 하나의 다이제스트를 생성할 때 어느 정도(일반적인 장비에서 0.2초 이상)의 시간이 소요되게 설정한다.
- 억지 기법 공격(brute-force attack)으로 패스워드를 추측하는 데 많은 시간이 소요되도록 하기 위한 것
- 솔팅(salting)
- 해시 함수를 돌리기 전에 원문에 임의의 문자열을 덧붙이는 것
- 솔트(salt)
- 단방향 해시 함수에서 다이제스트를 생성할 때 추가하는 바이트 단위의 임의의 문자열
- 장점
- {솔트+패스워드}의 다이제스트를 데이터베이스에 저장하고, 사용자가 로그인할 때 입력한 패스워드를 해시하여 일치 여부를 확인할 수 있다.
- 솔트가 추가된 레인보우 테이블을 새로 생성하여 원래 데이터를 유추하기에는 큰 데이터가 필요하다. 때문에 해킹 시도를 방지해준다.
- 사용자별로 다른 솔트를 사용한다면 동일한 패스워드를 사용하는 사용자의 다이제스트가 다르게 생성되어 인식 가능성 문제가 크게 개선된다.
Reference