BCrypt와 Argon2 비교

023·2024년 7월 15일
0
post-thumbnail

서론

이번에 진행하는 프로젝트의 사용자 정보의 보안 강화를 위해 사용할 해싱 알고리즘들 중 BCrypt와 Argon2라는 두 알고리즘을 비교 분석했다. 이 글에서는 각 알고리즘의 원리, 사용 기술 및 장단점을 설명하고, 우리 프로젝트에 Argon2를 선택한 이유를 밝힌다.

1. BCrypt

원리

BCrypt는 1999년 Niels Provos와 David Mazières가 설계한 암호화 해시 함수로, 다음과 같은 주요 특징을 가진다:

  1. Salt 추가: BCrypt는 해시를 생성할 때 랜덤하게 생성된 salt 값을 사용한다. 이는 같은 비밀번호라도 다른 해시 값을 가지게 하여, rainbow table 공격을 방지한다.
  2. Work Factor: BCrypt는 Work Factor를 통해 해시 계산의 복잡성을 조절할 수 있다. Work Factor가 증가할수록 계산 시간이 길어지며, 이는 비밀번호 추측 공격에 대해 더 강한 저항력을 제공한다.
  3. Blowfish 기반: BCrypt는 Blowfish 암호 알고리즘을 사용하여 여러 번의 암호화 라운드를 수행한다.

BCrypt 코드

import org.mindrot.jbcrypt.BCrypt;

public class BCryptExample {
    public static void main(String[] args) {
        String password = "myPassword123";
        
        // 해시 생성
        String hashedPassword = BCrypt.hashpw(password, BCrypt.gensalt(12));
        System.out.println("Hashed Password: " + hashedPassword);
        
        // 비밀번호 검증
        if (BCrypt.checkpw(password, hashedPassword)) {
            System.out.println("Password is valid!");
        } else {
            System.out.println("Invalid password.");
        }
    }
}

장단점

  • 장점:

    • 비용 인자를 통해 시간 복잡성을 조정할 수 있어, 하드웨어 성능 향상에 대응할 수 있다.
    • 광범위하게 사용되고 검증된 알고리즘이다.
    • Salt를 사용하여 동일한 비밀번호에 대해 다른 해시 값을 생성한다.
  • 단점:

    • 현대적인 GPU를 사용한 공격에 최적화되어 있지 않으며, 상대적으로 느리다.
    • 메모리 사용량이 적어 메모리 기반 공격에 취약하다.

2. Argon2

원리

Argon2는 2015년 패스워드 해시 경쟁에서 우승한 알고리즘으로, Alex Biryukov, Daniel Dinu, Dmitry Khovratovich가 설계하였다. Argon2는 Argon2d, Argon2i, Argon2id 세 가지 변형이 있으며, 다음과 같은 주요 특징을 가진다:

  1. 메모리 사용: Argon2는 메모리 사용량을 조정할 수 있어, 메모리 소모를 증가시켜 공격자가 해시를 계산하기 어렵게 만든다.
  2. 병렬 처리: Argon2는 병렬 처리를 지원하여 여러 CPU 코어를 활용할 수 있다.
  3. 버전: 각각 다른 유형의 공격에 대응하도록 설계되었다.
    • Argon2d: 메모리 접근 패턴이 데이터 종속적이라서 GPU 공격에 강하다.
    • Argon2i: 메모리 접근 패턴이 비결정적이라서 시간 기반 사이드 채널 공격에 강하다.
    • Argon2id: Argon2d와 Argon2i의 특성을 결합하여 종합적인 방어를 제공한다.

Argon2 예제

import de.mkammerer.argon2.Argon2;
import de.mkammerer.argon2.Argon2Factory;

public class Argon2Example {
    public static void main(String[] args) {
        String password = "myPassword123";
        Argon2 argon2 = Argon2Factory.create();
        
        try {
            // 해시 생성
            String hashedPassword = argon2.hash(2, 65536, 1, password);
            System.out.println("Hashed Password: " + hashedPassword);
            
            // 비밀번호 검증
            if (argon2.verify(hashedPassword, password)) {
                System.out.println("Password is valid!");
            } else {
                System.out.println("Invalid password.");
            }
        } finally {
            // Argon2 객체가 사용한 메모리 정리
            argon2.wipeArray(password.toCharArray());
        }
    }
}

장단점

  • 장점:

    • 메모리 사용량을 조정할 수 있어 메모리 기반 공격에 강력하다.
    • 병렬 처리를 지원하여 현대적인 하드웨어 성능을 최적화할 수 있다.
    • 다양한 변형을 통해 특정 공격 벡터에 대해 맞춤형 방어가 가능하다.
  • 단점:

    • 상대적으로 새로운 알고리즘으로, BCrypt만큼 널리 검증되지 않았다.
    • 복잡한 설정으로 인해 잘못된 구성 시 보안에 취약할 수 있다.

3. 비교

  1. 안전성:

    • BCrypt는 오랜 시간 동안 검증된 안전한 선택이다.
    • Argon2는 최신 공격 벡터에 대응할 수 있는 더 강력한 보안 기능을 제공한다.
  2. 성능:

    • BCrypt는 CPU 기반으로 설계되어 있고, 비용 인자를 통해 성능을 조절할 수 있다.
    • Argon2는 메모리와 병렬 처리를 최적화하여, 현대적인 하드웨어에서 더 나은 성능을 발휘할 수 있다.
  3. 적용 사례:

    • BCrypt는 기존 시스템과의 호환성이 중요하고, 검증된 솔루션을 선호하는 경우에 적합하다.
    • Argon2는 최신 보안 요구사항을 충족해야 하고, 높은 보안성과 성능을 필요로 하는 경우에 더 적합하다.

결론

이 분석을 통해 BCrypt와 Argon2의 차이를 확인할 수 있었고, 사용자 데이터 보호를 최우선으로 고려하여 Argon2를 도입하기로 하였다. 이를 통해 시스템의 전반적인 신뢰성을 향상시키고자 한다. 앞으로 이 알고리즘을 통해 사용자 정보의 보안을 강화해 나가겠다.

profile
Get your hands dirty

0개의 댓글