본문 바로가기

Spring Boot

[Spring Boot] BCrypt, SCrypt, Argon2 비밀번호 암호화 기법

728x90

BCrypt, SCrypt, Argon2 비밀번호 암호화 기법

1. BCrypt

특징

  • 안전성: 반복적인 해시 함수를 사용하여 공격에 견딜 수 있도록 설계됨.
  • 적응성: 비용 인자(cost factor)를 조정하여 처리 시간을 증가시켜 공격 난이도를 조정할 수 있음.
  • 견고성: 레인보우 테이블 공격에 강함.

장점

  • CPU를 많이 사용하여 브루트 포스 공격을 방어함.
  • 비용 인자를 조정하여 해시 계산 시간을 늘려 보안을 강화할 수 있음.

단점

  • 메모리 사용량이 적어 현대의 GPU 공격에 상대적으로 취약할 수 있음.

2. SCrypt

특징

  • 안전성: 메모리와 CPU를 모두 많이 사용하는 설계로, 병렬 공격을 어렵게 만듦.
  • 적응성: 메모리 및 CPU 사용량을 조정하여 공격 난이도를 조정할 수 있음.
  • 견고성: 기존의 해시 공격 기법들에 대해 강력한 저항성을 가짐.

장점

  • 메모리와 CPU를 많이 사용하여 브루트 포스 공격을 방어함.
  • 메모리 사용량을 조정하여 GPU 공격에도 저항할 수 있음.

단점

  • 메모리와 CPU를 많이 사용하기 때문에 리소스가 제한된 환경에서는 부담이 될 수 있음.

3. Argon2

특징

  • 안전성: 2015년 비밀번호 해시 콘테스트에서 우승한 알고리즘으로, 메모리와 CPU를 모두 많이 사용함.
  • 적응성: 메모리, CPU, 병렬성 인자를 조정하여 공격 난이도를 조정할 수 있음.
  • 견고성: 메모리 하드웨어 공격에 대해 강력한 저항성을 가짐.

장점

  • 최신 알고리즘으로, 현재 알려진 모든 공격에 대해 강력한 저항성을 가짐.
  • 메모리 및 CPU 사용량을 조정하여 보안을 강화할 수 있음.

단점

  • 상대적으로 새로운 알고리즘으로, 매우 오래된 시스템에서는 지원하지 않을 수 있음.

SCrypt 사용 예제

Gradle 설정

dependencies {
    implementation 'org.springframework.security:spring-security-crypto'
    implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
}

 

사용 예제


import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder;
import org.springframework.stereotype.Component;

@Component
public class PasswordEncoder {

    private static final SCryptPasswordEncoder encoder = new SCryptPasswordEncoder(
            16,
            8,
            1,
            32,
            64);

    public String encrpyt(String rawPassword) {
        return encoder.encode(rawPassword);
    }

    public boolean matches(String rawPassword, String encodedPassword) {
        return encoder.matches(rawPassword, encodedPassword);
    }
}