BCrypt vs SHA-256 + Salt 비교

m0chaid·2025년 4월 11일

키워드

목록 보기
7/13

비밀번호 저장용 해시로는 둘 다 솔트(salt)를 사용하지만, 보안성과 편의성에서 BCrypt가 우위입니다. 왜 그런지 간단히 비교해볼게요. 🧐


🧩 공통점

  • 솔트 사용: 해시 충돌 방지, 레인보우 테이블 공격 방어
  • 단방향 해시: 복호화 불가능, 비교만 가능

⚔️ 결정적 차이: 왜 BCrypt가 더 안전할까?

항목SHA-256 + SaltBCrypt
목적범용 해시 함수비밀번호 저장 전용 알고리즘
속도매우 빠름 (초당 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 기준)

  • 초당 1.2억 해시 연산
  • 8자리 숫자 비밀번호 → 1초 미만으로 크랙

BCrypt (워크 팩터 12 기준)

  • 초당 약 5건 처리
  • 같은 조건에서 → 231일 소요 😱

✅ 선택 가이드

목적추천 알고리즘
비밀번호 저장BCrypt
파일 무결성 검사✅ SHA-256
개인정보 암호화✅ AES-256

SHA-256은 만능 도구지만, 비밀번호 저장엔 너무 빠릅니다.
BCrypt는 느리게 처리하는 게 장점인 특별한 해시 도구입니다.


💼 BCrypt, SHA-256 관련 면접 대비 Q&A

❓ Q1. 비밀번호를 DB에 저장할 때 BCryptSHA-256 + Salt 중 어떤 걸 선택하겠습니까?

✅ A.
저는 BCrypt를 선택하겠습니다.
SHA-256 + Salt는 솔트 관리나 반복 횟수 설정 등을 개발자가 직접 처리해야 하고, GPU 기반 공격에 취약합니다.
반면 BCrypt는 솔트 자동 포함, 워크 팩터 조절, 의도적으로 느린 연산을 제공하여 훨씬 안전하게 비밀번호를 저장할 수 있습니다.


❓ Q2. SHA-256도 솔트를 붙이면 안전한 거 아닌가요?

✅ A.
부분적으로 맞습니다. 솔트를 붙이면 레인보우 테이블 공격은 방어할 수 있습니다.
하지만 SHA-256은 연산 속도가 빠르고 반복 횟수 조절이 어려워, 브루트 포스 공격에는 여전히 취약합니다.
반면 BCrypt는 느린 연산과 자체 솔트 기능으로 공격 비용을 높여 현실적으로 안전한 방어가 가능합니다.


❓ Q3. BCrypt는 왜 느리게 설계되었나요?

✅ A.
비밀번호 크랙 공격은 대부분 수억 번의 시도에 기반합니다.
BCrypt는 연산을 느리게 만들어 한 번의 시도에 수 밀리초의 시간 지연을 발생시키고,
이를 통해 공격자의 시도 횟수를 현실적으로 제한합니다.
즉, "느린 것이 보안"이라는 원리를 잘 반영한 알고리즘입니다.


❓ Q4. BCrypt가 내장 솔트를 쓴다는 건 무슨 의미인가요?

✅ A.
BCrypt는 gensalt() 메서드로 무작위 솔트를 자동 생성하며,
해시 결과값에 이 솔트를 포함하여 저장합니다.
따라서 별도로 솔트를 관리하거나 저장할 필요가 없고,
사용자가 같은 비밀번호를 입력해도 해시값이 항상 다르게 생성됩니다.


❓ Q5. SHA-256은 왜 비밀번호 저장용으로 부적절한가요?

✅ A.
SHA-256은 빠르고 효율적인 범용 해시 함수입니다.
하지만 이 특성 때문에 빠른 공격도 가능해지고,
워크 팩터 조절이 불가능해 하드웨어 발전 속도를 따라잡기 어렵습니다.
결과적으로, SHA-256은 비밀번호 저장보다는 파일 무결성 검사 등에 적합합니다.


❓ Q6. SHA-256과 AES는 어떻게 다른가요?

✅ A.

  • SHA-256단방향 해시로 복호화가 불가능하며, 주로 비밀번호 비교나 무결성 검사에 사용됩니다.
  • AES-256양방향 암호화 알고리즘으로, 암호화된 데이터를 다시 복호화할 수 있습니다.
    비밀번호 저장에는 SHA 또는 BCrypt를 사용하고, 민감한 개인정보 저장에는 AES를 사용합니다.

❓ Q7. Spring Security에서 비밀번호 암호화를 어떻게 설정하나요?

✅ A.
Spring Security에서는 PasswordEncoder 인터페이스를 사용합니다.
가장 안전하고 권장되는 구현체는 BCryptPasswordEncoder이며,
다음과 같이 사용합니다:

PasswordEncoder encoder = new BCryptPasswordEncoder();
String encodedPassword = encoder.encode(rawPassword);

이 방식은 내부적으로 솔트를 자동 적용하고, 워크 팩터도 조절 가능합니다.

profile
잘못된 내용 지적 부탁드려요:)

0개의 댓글