728x90
반응형
단방향은 왜 해싱을 사용할까? 해싱은 복호화가 불가능한 방식이 때문에 사용하는 것입니다.
단방향 해싱의 특징
입력값을 일정한 길이의 공전된 값으로 변환하여 DB컬럼 길이를 일정하게 유지가 가능합니다.
복호화가 불가능하므로 원본으로 돌릴 수 없기에 데이터 탈취해도 무의미 합니다.
항상 같은 입력값은 항상 같은 출력값을 나옵니다. 그래서 이러한 입력에 대한 출력 테이블 있으면 해킹이 될거 같은데라고 생각할 수 있습니다. 그래서 레인보우 테이블이란 데이터 집합으로 보안에 문제가 발생한 적이 있었죠… 이후에는 salt 라는 기법으로 이 방법을 해결합니다.
해시로 저장해야 할까?
비밀번호 등 복호화하지 않아야 할 데이터입니다. 즉, 누가 탈취해도 알 수 없기에 굉장히 안정적입니다. 예로 앱의 패스워드가 해싱을 적용한다면 앱의 관계자는 패스워드 복호화 할 수 없기 때문에 사용자 측면에서 안정성 & 신뢰성이 생깁니다.
사용 가능한 해시 알고리즘
알고리즘 | 복호화 가능 여부 | 비밀번호에 적합 여부 | 비고 |
MD5 | ❌ 단방향 | ❌ 위험 (빠름, 충돌 다발) | X |
SHA-256 | ❌ 단방향 | ⚠️ 보완 필요 (솔트 없음) | 단독 사용 금지 |
bcrypt | ❌ 단방향 | ✅ 권장 | 솔트 + 느린 계산 = 안전 |
scrypt | ❌ 단방향 | ✅ 권장 | 메모리 의존성 ↑ |
Argon2 | ❌ 단방향 | ✅ 최신 권장 | 2015년 비밀번호 해시 대회 수상 |
(참고) Spring Security 에서는?
일반적으로 bcrypt를 사용합니다. 스프링에서는 bcrypt 암호화를 하게 되면 {bcrypt} 라는 접두어로 암호화된 값 앞에 알고리즘 식별용으로 접두어를 적용합니다.
- DelegatingPasswordEncoder를 통해 암호흘 생성할 떄만 {암호화 알고리즘} 접두어 추가됩니다.
- BCryptPasswordEncoder 직접 사용하면 {암호화 알고리즘}은 붙지 않습니다.
PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
String encoded = encoder.encode("password");
System.out.println(encoded); // {bcrypt}로 시작하는 문자열 출력
정리
항목 | 내용 |
단방향 암호화 = 해싱? | ✅ 맞음. 복호화 불가 |
해시만으로 충분한가? | ❌ Salt 필수 (충돌, 무차별 대입 방지) |
비밀번호 해싱 추천 알고리즘 | ✅ bcrypt, ✅ Argon2, ✅ PBKDF2 |
{bcrypt} 의미 | Spring Security의 알고리즘 식별자 prefix |
직접 {bcrypt} 붙이나? | ❌ 아님. PasswordEncoder가 자동으로 붙임 |
728x90
반응형
'보안' 카테고리의 다른 글
[암호화] 웹 보안은 SSL! (0) | 2025.08.19 |
---|---|
[암호화] 대칭키란? (0) | 2025.08.19 |
UUID(Universally Unique Identifier) 버전과 사용법 (6) | 2025.08.10 |
암호화(Encryption)에 대해서 (1) | 2025.07.12 |
JCE 암호화 트러블 슈팅 (1) | 2025.04.29 |