비밀번호 저장용 해시로는 둘 다 솔트(salt)를 사용하지만, 보안성과 편의성에서 BCrypt가 우위입니다. 왜 그런지 간단히 비교해볼게요. 🧐
| 항목 | SHA-256 + Salt | BCrypt |
|---|---|---|
| 목적 | 범용 해시 함수 | 비밀번호 저장 전용 알고리즘 |
| 속도 | 매우 빠름 (초당 1억 건 이상) | 일부러 느리게 설계됨 |
| 솔트 관리 | 개발자가 직접 생성/저장 필요 | 자동 생성 + 해시값에 포함됨 |
| 반복 횟수 | 고정 | 워크 팩터(Work Factor)로 조절 가능 |
| 보안성 | 병렬 처리(GPU)에 취약 | 병렬 공격에 강함 (느림 = 방어력) |
1. SHA-256 + Salt (직접 구현)
String salt = "랜덤생성";
String hash = sha256(salt + password);
// salt와 hash를 각각 저장해야 함
2. BCrypt (자동 솔트 내장)
String hash = BCrypt.hashpw(password, BCrypt.gensalt());
// hash 안에 솔트 포함됨 → DB에 hash 하나만 저장하면 됨
SHA-256 (RTX 4090 기준)
BCrypt (워크 팩터 12 기준)
| 목적 | 추천 알고리즘 |
|---|---|
| 비밀번호 저장 | ✅ BCrypt |
| 파일 무결성 검사 | ✅ SHA-256 |
| 개인정보 암호화 | ✅ AES-256 |
SHA-256은 만능 도구지만, 비밀번호 저장엔 너무 빠릅니다.
BCrypt는 느리게 처리하는 게 장점인 특별한 해시 도구입니다.
BCrypt와 SHA-256 + Salt 중 어떤 걸 선택하겠습니까?✅ A.
저는 BCrypt를 선택하겠습니다.
SHA-256 + Salt는 솔트 관리나 반복 횟수 설정 등을 개발자가 직접 처리해야 하고, GPU 기반 공격에 취약합니다.
반면 BCrypt는 솔트 자동 포함, 워크 팩터 조절, 의도적으로 느린 연산을 제공하여 훨씬 안전하게 비밀번호를 저장할 수 있습니다.
✅ A.
부분적으로 맞습니다. 솔트를 붙이면 레인보우 테이블 공격은 방어할 수 있습니다.
하지만 SHA-256은 연산 속도가 빠르고 반복 횟수 조절이 어려워, 브루트 포스 공격에는 여전히 취약합니다.
반면 BCrypt는 느린 연산과 자체 솔트 기능으로 공격 비용을 높여 현실적으로 안전한 방어가 가능합니다.
✅ A.
비밀번호 크랙 공격은 대부분 수억 번의 시도에 기반합니다.
BCrypt는 연산을 느리게 만들어 한 번의 시도에 수 밀리초의 시간 지연을 발생시키고,
이를 통해 공격자의 시도 횟수를 현실적으로 제한합니다.
즉, "느린 것이 보안"이라는 원리를 잘 반영한 알고리즘입니다.
✅ A.
BCrypt는 gensalt() 메서드로 무작위 솔트를 자동 생성하며,
해시 결과값에 이 솔트를 포함하여 저장합니다.
따라서 별도로 솔트를 관리하거나 저장할 필요가 없고,
사용자가 같은 비밀번호를 입력해도 해시값이 항상 다르게 생성됩니다.
✅ A.
SHA-256은 빠르고 효율적인 범용 해시 함수입니다.
하지만 이 특성 때문에 빠른 공격도 가능해지고,
워크 팩터 조절이 불가능해 하드웨어 발전 속도를 따라잡기 어렵습니다.
결과적으로, SHA-256은 비밀번호 저장보다는 파일 무결성 검사 등에 적합합니다.
✅ A.
✅ A.
Spring Security에서는 PasswordEncoder 인터페이스를 사용합니다.
가장 안전하고 권장되는 구현체는 BCryptPasswordEncoder이며,
다음과 같이 사용합니다:
PasswordEncoder encoder = new BCryptPasswordEncoder();
String encodedPassword = encoder.encode(rawPassword);
이 방식은 내부적으로 솔트를 자동 적용하고, 워크 팩터도 조절 가능합니다.