BCrypt vs Argon2: .NET에서 비밀번호 해싱 – 실용적인 심층 탐구
Source: Dev.to
개요
비밀번호 저장은 .NET 애플리케이션에서 매우 중요한 보안 문제입니다. 빠른 암호화 해시(SHA‑256 등)는 공격자가 GPU나 ASIC을 이용해 초당 수십억 번의 추측을 수행할 수 있기 때문에 부적합합니다. 비밀번호 전용 해시 알고리즘은 의도적으로 느리게 설계되며 각 비밀번호마다 고유한 랜덤 솔트를 포함하여 무차별 대입 및 레인보우 테이블 공격을 비용이 크게 들게 만듭니다.
BCrypt
BCrypt는 1999년에 도입되었으며 Blowfish 암호화 알고리즘을 기반으로 합니다. 수정된, 비용이 많이 드는 키 스케줄을 여러 번 반복합니다.
기술 세부 사항
- 메모리 사용량: 고정 낮음(~4 KB per hash) – 메모리‑하드하지 않음.
- Cost 파라미터: 단일 “작업 인자”(예:
Cost = 13→ 2¹³ = 8 192 반복). - 성능: 순수 CPU 의존; 최신 GPU도 여전히 비교적 저렴하게 다수의 BCrypt 해시를 병렬로 계산할 수 있음.
설치
dotnet add package BCrypt.Net-Next
샘플 코드 (C#)
using BCrypt.Net;
public static class PasswordHasher
{
private const int WorkFactor = 13;
public static string Hash(string password)
=> BCrypt.Net.BCrypt.HashPassword(password, WorkFactor);
public static bool Verify(string password, string hash)
=> BCrypt.Net.BCrypt.Verify(password, hash);
}
Argon2
Argon2는 2015년 Password Hashing Competition에서 우승했으며 비밀번호 해싱을 위해 처음부터 설계되었습니다.
기술 세부 사항
- 메모리‑하드: 추측당 상당한 RAM을 할당하도록 강제하여 대규모 병렬 공격 비용을 크게 상승시킴.
- 변형:
Argon2d,Argon2i,Argon2id(비밀번호에 권장 – 하이브리드 접근). - 조정 가능한 파라미터:
- 메모리 크기(
m) – 일반적으로 32 MB–128 MB 이상. - 반복 횟수(
t). - 병렬성(
p).
- 메모리 크기(
설치
dotnet add package Isopoh.Cryptography.Argon2
샘플 코드 (C#)
using Isopoh.Cryptography.Argon2;
public static class PasswordHasher
{
public static string Hash(string password)
=> Argon2.Hash(password);
public static bool Verify(string password, string hash)
=> Argon2.Verify(hash, password);
}
이 라이브러리는 안전한 기본값을 제공하며 솔트 생성 및 인코딩을 자동으로 처리합니다.
비교
| 기능 | BCrypt | Argon2 |
|---|---|---|
| 메모리 사용량 | 고정 ~4 KB (메모리‑하드 아님) | 조정 가능, 일반적으로 32 MB–128 MB+ |
| 공격 저항성 | CPU 무차별 공격에 강하지만 대규모 GPU 병렬성에 약함 | 높은 메모리 요구량으로 GPU, ASIC, 병렬 공격에 강함 |
| 튜닝 | 단일 cost 파라미터 | 세 파라미터: 메모리, 시간, 스레드 |
| 설계 연도 | 1999 (Blowfish 기반) | 2015 (비밀번호 해싱 전용 설계) |
언제 어떤 것을 사용해야 할까
BCrypt를 사용할 경우:
- 이미 BCrypt에 의존하고 있는 레거시 시스템을 유지 보수할 때.
- 메모리가 매우 제한된 서버에 배포할 때.
- 단순함이 주요 고려 사항일 때.
Argon2를 사용할 경우:
- 새로운 애플리케이션을 구축할 때.
- 매우 민감한 사용자 데이터를 다룰 때.
- 현재 및 미래의 하드웨어 공격에 대한 최상의 보호를 원할 때.
모범 사례
- 프로덕션 하드웨어에서 벤치마크하십시오. 해시당 검증 시간이 400–800 ms 정도가 목표입니다.
- 특히 Argon2의 경우 동시 부하 하에서 메모리 소비를 테스트하십시오.
- 알고리즘을 전환할 때는 다음 로그인 성공 시 비밀번호를 재해시하십시오.
- 비밀번호 해싱과 함께 로그인 시도 제한 및 가능한 경우 **다중 인증(2FA)**을 결합하십시오.