패스워드 암호화
패스워드 암호화 (Encryption)는 사용자가 입력한 비밀번호를 그대로 평문으로 저장하지않고 암호화한 후 암호화된 데이터를 DB에 저장하는 것을 말합니다.
사용자 인증 정보를 안전하게 보관하기 위해 꼭 필요한 작업으로 암호화 작업을 하지 않을 경우 해커가 서버의 사용자 데이터베이스에 접근하여 저장된 패스워드를 쉽게 볼 수 있습니다.
암호화 방식
암호화는 대표적으로 2가지 방식이 있습니다.
- 단방향 암호화
- 복호화해서 원래의 비밀번호를 알 수 없는 방식
- 양방향 암호화
- 복호화해서 원래의 비밀번호를 알 수 있는 방식
- 복호화란?
- 암호화 된 것을 암호화 되기 전의 상태로 되돌리는 것을 말합니다.
또한, 양방향 암호화는 대칭형 암호화와 비대칭형 암호화가 존재합니다.
- 대칭형 암호화
- 암호화에 사용하는 key와 복호화에 사용하는 key가 동일한 방식
- 비대칭형 암호화
- 암호화에 사용하는 key와 복호화에 사용하는 key가 다른 방식
이번 포스팅에서는 양방향이 아닌 단방향 방식인 Hashing
에 대해 알아보겠습니다.
단방향 해시 함수 ( One-Way Hash Function )
단방향 해시 함수는 알고리즘에 의해 원본 데이터를 매핑시켜 완전히 다른 암호화된 데이터로 변환시키는 것을 의미합니다.
이러한 변환을 해시 (Hash)
라고 하며 Hash를 통해 변환된 암호화된 데이터를 다이제스트 (Digest)
라고 합니다.
단방향 해시 함수는 출력 값으로 입력 값을 유추할 수 없습니다.
즉, `digest`를 복호화하여 원본 데이터를 구할 수 없습니다.
간단 예시
123456 (원본 데이터)
을 해시 함수에 돌려서fs32a3xzz0 (Digest)
을 생성하고 해당 데이터를 DB에 저장합니다.활용 사례
기존의 비밀번호는 어디에도 저장되지 않고 암호화된 Digest만 저장해 사용합니다.
사용자가 로그인 할 때 기존에 DB에 저장된 암호화된 Digest와 로그인할 때 입력받은 비밀번호를 단방향 암호화를 한 후 비교합니다.
사용자가 비밀번호를 찾을 때는 기존의 비밀번호를 알려주는 방식이 아닌 재설정하는 방식을 사용합니다.
단방향 해시 함수의 문제점
같은 원본 데이터는 같은 digest를 반환합니다.
같은 알고리즘과 같은 인코딩 방식을 선택하여 암호화하면 같은 결과을 반환하기떄문에 해커는 레인보우 테이블 ( Rainbow Table )을 이용하여 쉽게 원본 데이터를 얻어낼 수 있습니다.
- 레인보우 테이블 (Rainbow Table)
- 입력 값 - 출력 값을 저장해 놓는 것
그렇다면 이러한 Rainbow Table을 만들 수 없도록 할 수 있을까?
단방향 해시 함수 보완하기
Salt
Salt
을 뿌려 공격자를 방해하는 방법이 있습니다.단방향 암호화시 `원본 데이터`에 추가 데이터를 붙인 후 Hash 함수를 처리합니다.
이러한 방법으로 같은 비밀번호를 사용하는 사용자 A, B가 있다면 두 사용자의 Hash 출력 값이 달라집니다.
이 때, Salt 값은 임의로 암호화 최초에 설정하고 해당 Salt 값은 기억하고 있어야합니다.
Key Stretching
Key Stretching
은Salt
와 비밀번호를 해시 함수에 넣는 과정을 여러번 반복하여 공격자가 복호화 하기 힘들게 만드는 방법입니다.
정리
두가지 보완 방법을 같이 사용한다면 아래 그리과 같은 형태로 보다 안전하게 사용자 인증 정보를 보호할 수 있습니다.