진짜 개발자
본문 바로가기

Security

Security - 안전한 패스워드 저장방법(단방향 해시함수란?)

728x90
안전한 패스워드 저장

안전한 패스워드 저장방법에 대해 알아보도록 하겠습니다.

(이글은 https://d2.naver.com/helloworld/318732 를 참조하여 작성되었습니다.)

 

 

 

단방향 해시함수란 ?

  • 단순 plain/text
  • 암호화된 text

서버에서 사용자의 암호를 저장하는 방법은 위와 같습니다. 서버에 암호를 단순 plain/text로 저장하는 것은 매우 위험한 행위 입니다. database가 노출된다면, 사용자의 모든 계정의 비밀번호가 노출되는것이기 때문입니다.

 

따라서 보통의 경우 패스워드를 암호화하여 저장합니다. 이때 주로 단방향 해시함수를 이용해, 패스워드를 암호화 합니다. 단방향 해시함수란, 말그대로 해시함수로 암호화는 가능하지만, 반대로 해독이 불가능한 해시함수를 의미합니다.

 

 

1. 왜 단방향 해시함수인가?

간단합니다. 만약 양방향 해시함수를 사용한경우, 공격자가 다이제스트(암호화된 텍스트)를 취득하게 된다면, 존재하는 모든 해시함수를 적용한다면, 패스워드를 획득할 수 있기 때문입니다.

 

 

 

2. 단방향 해시함수의 단점

인식가능성

단방향 해시함수로 암호화한 문자열이 항상 같은 다이제스트를 내뱉는다면, 공격자가 전처리된 다이제스트를 많이 확보한 경우, 탈취한 다이제스트와 전처리된 다이제스트들을 비교하여 패스워드를 찾아낼 수도 있습니다.

이렇게 전처리된 다이제스트 목록을 레인보우 테이블이라고 하며, 이를 통한 공격 방식을 레인보우 공격 이라고 합니다.

 

속도

해시함수는, 본래 암호화에 이용되기 위해 설계된것이 아니라, 빠르게 데이터를 검색하기 위해 설계된 것입니다(해시테이블). 바로 이점 때문에 문제가 발생합니다. 해시함수의 빠른 처리 속도로 인하여, 공격자는 매우 빠른 속도로 레인보우 공격을 시도할 수 있습니다. (암호화에 MD5함수를 이용한 경우, 일반 장비를 이용해 1초당 56억 개의 다이제스트를 비교해볼 수 있다고 합니다.)

 

 

 

3. 단방향 해시함수 보완

솔팅(salting)

솔트(salt) 는 단방향 해시함수를 이용해 다이제스트를 생성할때 추가되는 바이트 단위의 임의의 문자열입니다. 이 솔트(salt)를 이용해, 다이제스트를 생성하는 것을 솔팅(salting)이라고 합니다.

 

솔팅을 이용한다면, "testPassworD"를 단방향 해시함수로 암호화한 결과 다이제스트를 얻어낸다고 하더라도, 솔팅된 다이제스트와 결과값이 다르기 때문에 일치성 판단이 어려워지게 됩니다.

 

 

키 스트레칭(key stretching)

키스트레칭은 원본 패스워드를 암호화해 생겨난 다이제스트를 다시 재귀적으로 암호화하는 방식으로 암호화하는 방식을 말합니다.

 

이렇게하면 저장할때 해시함수를 행한 횟수와 동일한 횟수만큼 해야만 패스워드 일치여부를 확인할 수 있습니다.