가이드라인

비밀번호 저장

애플리케이션이 사용자를 인증하는 경우 비밀번호도 처리할 가능성이 높습니다.

사용자 비밀번호를 다루는 것은 정말 큰 문제이며, 이를 적절하게 처리하는 것은 더 큰 문제입니다. 

애플리케이션이 공격을 받아 사용자 비밀번호가 인터넷을 통해 모든 사람이 볼 수 있도록 유출되는 것보다 더 끔찍한 시나리오는 상상하기 어렵습니다. 개인적으로 생각만 해도 몸서리가 쳐집니다. 그렇다면 어떻게 하면 비밀번호를 모범 사례에 따라 안전하게 보관할 수 있을까요? 몇 가지 방법을 살펴보겠습니다. 

암호화와 해싱 비교

표면적으로는 암호화가 안전한 비밀번호 저장을 위한 괜찮은 솔루션이라고 생각할 수 있지만, 전적으로 암호화에 의존하는 것은 다소 문제가 될 수 있습니다. 

암호화는 본질적으로 양방향 기능으로, 비밀번호를 암호화할 수 있는 것처럼 암호를 해독할 수도 있다는 뜻입니다. 완벽하게 논리적이지 않나요? 그렇지 않다면 사용자의 비밀번호가 데이터베이스에 저장된 것과 일치하는지 어떻게 검증할 수 있을까요? 

따라서 비밀번호를 해독할 수 있는 능력은 매우 큰 책임이기도 합니다. 누군가 서버를 침해하여 비밀번호 암호문을 입수하면 비밀번호를 해독하는 데 필요한 핵심 자료도 얻을 수 있을 가능성이 높습니다.

반면 해싱은 단방향이라는 특성으로 인해 비밀번호에 훨씬 더 적합합니다. 일단 해싱한 후에는 암호 텍스트를 원래의 일반 텍스트로 직접 되돌릴 수 있는 기능이 없습니다. 이러한 특성 때문에 해시는 비밀번호 보호에 매우 적합합니다. 

모든 해시가 똑같이 생성되는 것은 아닙니다.

저장용 비밀번호 해싱을 결정한 후에는 해시 함수를 적용하고 호출하는 것만큼 간단하지도 않습니다. 

해시는 다양한 형태와 크기로 제공되며, 지난 10년간의 컴퓨팅 기술 발전을 고려할 때 대부분 비밀번호를 저장하는 데 적합하지 않습니다. 

앞서 언급했듯이 해시는 단방향 함수이기 때문에 되돌릴 수 없습니다. 기술적으로는 맞지만 해시는 결정론적이기 때문에 공격자가 충분한 시간과 리소스를 확보하면 해시를 원래의 일반 텍스트로 되돌릴 수 있는 무차별 대입 공격 전술에 취약합니다.

이러한 이유로 해싱 함수를 두 가지 카테고리로 나누었습니다:

  • 암호화 해시
  • 비밀번호 해시
기능 암호화 해시 비밀번호 해시
속도 매우 빠름 의도적으로 느림
작업 계수 조정 가능 아니요

비밀번호 해시의 주요 특징은 해시를 계산하는 데 필요한 노력의 양을 정의하는 '작업 계수'(단일 정수 또는 여러 매개변수)가 있다는 점입니다. 

수년에 걸쳐 CPU와 GPU의 속도가 빨라지면서 소비자 하드웨어에서 해시에 대한 대규모 무차별 대입 공격을 수행하기가 쉬워졌고, 이는 시간이 지날수록 해시의 보안이 점점 더 약해질 수 있다는 것을 의미합니다. 

"작업 계수"는 해시가 업계 트렌드를 따르는 방식으로 저장되도록 하는 데 사용됩니다. 하드웨어가 빨라질수록 알고리즘의 작업 계수가 증가하여 해시를 해독하는 데 더 많은 시간과 노력이 소요됩니다. 예를 들어 최신 하드웨어에서 100ms라고 가정해 보겠습니다. 

즉, 실제로는 2~3년마다 작업 요소를 늘려야 할 수도 있습니다.

암호화 해시 비밀번호 해시
MD5 bcrypt
SHA-1 scrypt
SHA-2 PBKDF2
SHA-3 아르곤2