요구사항에 맞는 패스워드 암호화 알고리즘 선택하기(Bcrypt, Scrypt, Argon2)

junhyeong·2024년 1월 19일
2

뽀모도로 메이트

목록 보기
4/5
post-thumbnail

최근에 유데미 강의를 통해 Spring Security에 대해서 공부하고 있습니다. 이번에 공부하게 된 내용 중 하나는 패스워드를 암호화하는 방식이었습니다.

MVP에는 패스워드를 사용하는 기능이 없어서 아직 고민을 안해봤지만, 이후 기능인 스터디룸 비밀번호와 회원 비밀번호에 암호화가 필요하기 때문에 이번 기회에 어떤 암호화 함수를 사용할지 미리 정해보려고 합니다.

따라서, 단방향 해시 함수 대해 알아보고, 뽀모도로 서비스에는 어떤 함수가 가장 잘 어울릴지 결정해보겠습니다.

단방향 해시 함수 ( One-Way Hash Function )

먼저 단방향 해시 함수의 한 예시인 SHA-256에 대해 얘기해보겠습니다. SHA-256은 해시 값을 이용한 암호화 방식 중 하나입니다. 하지만 최신 시스템들은 SHA-256을 이용해 1초도 안 되는 시간에 수십억 개의 해시 계산을 수행할 수 있기 때문에 더 이상 안전하지 않다고 볼 수 있습니다.

그래서 Spring Security에서 권장하는 방식은 1초를 워크 팩터(Work factor)로 적용해 적응형 단방향 함수를 사용하는 것입니다. 이 함수들은 해싱은 가능하지만, 해시를 되돌리지는 못하는 특징을 가지고 있습니다. 대표적인 예로는 bcrypt, scrypt, argon2가 있습니다.

워크 팩터는 시스템에서 패스워드를 확인하는 데 걸리는 시간을 나타내는 개념입니다. 패스워드를 해싱하고 이것을 저장된 값과 비교하는 데 걸리는 시간을 의미하며 상당한 양의 작업이 필요해서 최소 1초가 걸립니다.

문제는 시간이 갈수록 시스템이 향상되는 것입니다. 따라서 암호화 알고리즘도 그에 맞게 적응해야합니다. 이를 위해, 알고리즘의 복잡성과 소요 시간을 설정할 수 있어야 합니다.

일반적으로 컴퓨터 알고리즘에 대해 논의할 때 신속성이 중요시되는 경우가 많습니다. 그러나 패스워드 저장과 같은 경우에는, 해싱이 너무 빠르게 이루어진다면 다른 사람이 해싱을 수행하고 브루트 포스 알고리즘을 적용할 수 있습니다. 이는 무식하게 발생할 수 있는 모든 경우를 탐색하는 방법(완전 탐색)을 의미합니다. 따라서 해싱 알고리즘이 너무 빨리 작동하지 않도록 주의해야 합니다.

함수 비교

이제, Spring Security에서 권장하는 단방향 함수들을 비교하여 뽀모도로 서비스에 어떤 함수가 가장 적합한지 알아보겠습니다.

bcrypt

  • 가장 널리 사용되는 암호화 함수 중 하나입니다.
  • 보안적으로 검증된 함수로 암호화의 안정성과 신뢰성을 보장합니다.
  • 해시화된 비밀번호에 솔트(Salt)를 추가하여 보안성을 높입니다.
  • 솔트는 각 비밀번호에 대해 고유한 값을 생성하여 해시화된 비밀번호와 결합시킵니다.
  • 느린 해시 함수로 알려져 있어, 브루트 포스 공격에 대한 저항력을 가지고 있습니다.

** 솔트(salt): 단방향 해시 함수에서 해시값을 생성할 때 추가되는 바이트 단위의 임의의 문자열

장점: 검증된 보안성, 상대적으로 빠른 실행 속도, 단순한 구현
단점: GPU를 사용한 공격에 취약

scrypt

  • 비교적 최근에 개발된 암호화 함수입니다.
  • 적응형 함수로, 더 많은 메모리를 사용함으로써 공격자에 대한 저항력을 강화합니다.
  • 메모리 집약적인 작업으로, 대량의 메모리를 요구하기 때문에 공격자가 대규모 하드웨어 리소스를 사용하여 공격하는 것을 어렵게 만듭니다.
  • 솔트를 사용하여 보안성을 강화하며, 느린 해시 함수로 알려져 있어 브루트 포스 공격에 대한 저항력을 가지고 있습니다.
  • 암호화된 비밀번호의 길이가 가변적이기 때문에 긴 비밀번호도 저장할 수 있습니다.

장점: 강력한 보안성, 목표로 하는 메모리 및 시간 사용량을 조정할 수 있는 유연성, 솔트 지원
단점: 실행 속도가 상대적으로 느림, 구현이 상대적으로 복잡

argon2

  • 최신 암호화 함수 중 하나로, 비밀번호 해시화에 사용되는 알고리즘입니다.
  • 메모리 집약적이며, CPU 및 메모리 사용량을 조정할 수 있어 공격자에 대한 저항력을 높일 수 있습니다.
  • 솔트와 함께 사용하여 보안성을 강화합니다.
  • 시간 및 메모리 요구 사항을 조정하여 알고리즘의 복잡성을 설정할 수 있습니다.
  • 현재까지 알려진 공격에 대해 강력한 보안성을 제공합니다.

장점: 최신 암호화 함수로서 매우 강력한 보안성, 메모리 및 시간 사용량을 조정할 수 있는 유연성, 솔트 지원
단점: 실행 속도가 상대적으로 느림, 구현이 상대적으로 복잡

뽀모도로 메이트 요구사항

뽀모도로 서비스에서는 스터디룸 비밀번호와 회원 비밀번호에 암호화를 적용합니다. 각각의 요구사항에 필요한 보안수준을 파악해보겠습니다.

방 비밀번호 암호화

간단한 숫자 4자리에서 8자리로 이루어진 비밀번호이며, 데이터 유출이 있어도 크게 문제는 없지 않나라는 생각이 들었습니다.

그러나, 스터디룸 비밀번호도 결국 비밀번호이며, 스터디룸의 접근 허용 여부를 결정하는 중요한 요소이므로, 사용자의 편의성을 위해 암호화가 필요하다고 판단했습니다. 비밀번호를 평문으로 다루어도 실제로 중요한 데이터가 유출되는 것은 아니지만, 만약 서비스가 해킹당한다면 사용자들이 불편함을 겪을 수 있기 때문입니다.

회원 비밀번호

회원 비밀번호는 사용자의 개인정보를 보호하는 중요한 요소이므로, 반드시 암호화해야 합니다.

그러나 뽀모도로 메이트 서비스의 특성 상, 중요한 데이터를 가지고 있지 않기 때문에 높은 수준의 보안이 필요하지는 않습니다.

결론

따라서, 뽀모도로 메이트 서비스에서는 서비스의 특성과 보안 수준을 고려하면, 고도의 보안성을 가진 Argon2나 메모리 집약적인 scrypt보다는 상대적으로 실행 속도가 빠르고 구현이 단순한 bcrypt를 사용하는 것이 적합하다고 판단하였습니다.

참고

profile
매일매일이 성장하는 하루가 될 수 있도록!

0개의 댓글