가이드라인

비밀번호 저장

사용자 인증 기능을 갖춘 애플리케이션이라면 비밀번호를 다루게 될 가능성이 높습니다.

사용자 비밀번호를 다루는 것은 매우 중요한 일이며, 이를 적절하게 처리하는 것은 더욱 중요합니다.

애플리케이션이 공격받아 사용자 비밀번호가 인터넷에 유출되어 누구나 볼 수 있게 되는 상황보다 더 끔찍한 일은 상상하기 어렵습니다. 생각만 해도 아찔한 일이죠. 그렇다면 비밀번호를 모범 사례에 따라 안전하게 저장하려면 어떻게 해야 할까요? 몇 가지 방법을 살펴보겠습니다.

암호화와 해싱의 차이

표면적으로는 암호화가 비밀번호를 안전하게 저장하는 좋은 해결책처럼 보일 수 있지만, 암호화에만 전적으로 의존하는 것은 다소 문제가 될 수 있습니다.

암호화는 본질적으로 양방향 함수입니다. 즉, 비밀번호를 암호화할 수 있다면 당연히 복호화도 가능하다는 뜻입니다. 논리적으로 당연하지 않나요? 그렇지 않다면 데이터베이스에 저장된 값과 사용자가 입력한 비밀번호가 일치하는지 어떻게 확인할 수 있을까요?

따라서 비밀번호를 복호화할 수 있다는 점은 상당한 위험 요소가 됩니다. 누군가 서버를 해킹하여 암호화된 비밀번호를 탈취한다면, 복호화에 필요한 키 자료까지 손에 넣을 가능성이 매우 높기 때문입니다.

반면 해싱은 단방향성을 띠고 있어 비밀번호 저장에 훨씬 적합합니다. 일단 해싱을 거치면 암호화된 값을 다시 원래의 평문으로 되돌리는 함수가 존재하지 않습니다. 이러한 특성 덕분에 해시는 비밀번호 보호에 최적화되어 있습니다.

모든 해시가 동일한 것은 아닙니다

비밀번호 저장 방식으로 해싱을 선택했다고 해서 단순히 해시 함수를 적용하는 것만으로 끝나는 것은 아닙니다.

해시의 종류는 매우 다양하지만, 지난 10년간의 컴퓨팅 기술 발전을 고려할 때 대부분은 비밀번호 저장에 적합하지 않습니다.

앞서 언급했듯이 해시는 단방향 함수이므로 역산이 불가능합니다. 하지만 이는 이론적인 이야기일 뿐, 해싱은 결정론적이기 때문에 무차별 대입 공격(brute-force)에 취약할 수 있습니다. 충분한 시간과 자원이 주어진다면 공격자가 해시를 원래의 평문으로 되돌릴 가능성이 존재합니다.

이러한 이유로 해시 함수를 두 가지 범주로 나눕니다.

  • 암호학적 해시
  • 비밀번호 해시
Feature Cryptographic hash Password hash
Speed Very fast Intentionally slow
Work factor can be adjusted No Yes

비밀번호 해시의 핵심 기능은 해시 계산에 필요한 노력을 결정하는 "작업 계수(work factor)"(단일 정수 또는 여러 매개변수)가 있다는 점입니다.

수년간 CPU와 GPU 성능이 향상되면서 일반 소비자용 하드웨어로도 해시에 대한 대규모 무차별 대입 공격을 수행하기가 쉬워졌습니다. 이는 시간이 지날수록 해시의 보안성이 점차 낮아질 수 있음을 의미합니다.

"작업 계수"는 업계 트렌드에 맞춰 해시가 안전하게 저장되도록 보장하는 역할을 합니다. 하드웨어 성능이 좋아짐에 따라 알고리즘의 작업 계수를 높여 해시를 복호화하는 데 더 많은 시간과 노력이 들도록 설정해야 합니다. 예를 들어, 최신 하드웨어에서 100ms가 소요되도록 설정하는 식입니다.

즉, 실제 환경에서는 2~3년마다 작업 계수를 높여야 할 수도 있습니다.

Cryptographic hash Password hash
MD5 bcrypt
SHA-1 scrypt
SHA-2 PBKDF2
SHA-3 Argon2

‍

태그라인

실무에 바로 적용하는 보안 코딩

OWASP Top 10과 같은 소프트웨어 취약점을 이해하고 완화하기 위한 보안 코딩 가이드라인을 살펴보고, 실제 앱 시뮬레이션을 통해 실습할 수 있는 가이드형 교육 미션을 시작해 보세요.

추가 가이드라인
데모 예약하기