728x90
[Node.js] 비밀번호 암호화 구조 정리 – Salt와 Key Stretching은 왜 필요할까?
실무에서 사용자 비밀번호를 안전하게 저장하기 위해선 단순한 해시 처리만으로는 부족합니다.
이 포스트에서는 Salt, Key Stretching을 이용한 안전한 비밀번호 암호화 방식에 대해 정리합니다.
솔트(Salt)란?
해시 함수에 추가적으로 더해지는 무작위 데이터입니다.
같은 문자열이라도 항상 다른 해시 결과를 얻기 위해 사용됩니다.
왜 필요한가요?
예를 들어, 아래 문자열을 SHA512로 해시해봅니다:
'jeong-park' → 2C1E444B...D5935AA
누가 해도 같은 결과가 나옵니다.
⇒ 이를 통해 레인보우 테이블 공격 등으로 역추적이 가능해집니다.
Key Stretching이란?
해시 함수를 여러 번 반복하여 처리 속도를 늦추고 보안을 높이는 방법
효과
- 무차별 대입 공격(Brute-force) 방지
- 레인보우 테이블 무력화
코드 예시 – PBKDF2 기반 비밀번호 암호화
const crypto = require('crypto');
const util = require('util');
const pbkdf2Promise = util.promisify(crypto.pbkdf2);
const randomBytesPromise = util.promisify(crypto.randomBytes);
// 1. Salt 생성
const createSalt = async () => {
const new_salt = await randomBytesPromise(64);
return new_salt.toString("base64");
};
// 2. 비밀번호 + Salt => 반복 해싱
const createHashedPassword = async (password, salt) => {
const key = await pbkdf2Promise(password, salt, 100000, 64, "sha512");
return { hashedPassword: key.toString("base64"), salt };
};
// 3. 입력값 검증
const verifyPassword = async (password, userSalt, userPassword) => {
const key = await pbkdf2Promise(password, userSalt, 100000, 64, 'sha512');
return key.toString('base64') === userPassword;
};
구조 요약
- 사용자 비밀번호 입력
- 랜덤한 솔트 생성
password + salt
→PBKDF2
로 N번 해싱- 해시된 비밀번호 저장
- 로그인 시 동일 방식으로 비교
정리 포인트
요소 | 설명 |
---|---|
Salt | 동일한 입력 → 다른 해시 결과 |
Key Stretching | 계산 시간 증가 → 보안 강화 |
PBKDF2 | Node.js 내장 해시 알고리즘 (HMAC + 반복) |
참고
- 위키백과: https://ko.wikipedia.org/wiki/솔트_(암호학)
- 보안을 위해 꼭 필요한 과정, 기본 개념을 이해하고 직접 구현해보면 확실히 익힐 수 있어요!
반응형
'백엔드 개발 > 인증 · 보안' 카테고리의 다른 글
Refresh Token Rotation이란? JWT 보안 강화를 위한 필수 전략 (1) | 2025.04.27 |
---|---|
개인정보 수집 동의는 왜 받아야 할까? 법적 의무부터 실무 처리까지 정리 (0) | 2025.04.24 |
인증과 인가, 그리고 JWT까지 완벽 정리 (1) | 2024.01.02 |
[Node.js] 중복 로그인 어떻게 막을까? JWT + Redis 실무 구현 예시 (0) | 2023.07.05 |
[Node.js] JWT 에러 핸들링 (0) | 2023.04.19 |