웹 애플리케이션 인증에서 암호화된 해시 함수와 패스워드 솔트의 중요성
웹 애플리케이션 인증에서 암호화된 해시 함수와 패스워드 솔트의 중요성
웹 애플리케이션 인증에서 암호화된 해시 함수와 패스워드 솔트는 보안을 강화하기 위한 필수 요소입니다. 이 글에서는 각각의 개념과 중요성을 살펴보고, 안전한 비밀번호 관리 방식을 제시합니다.
1. 암호화된 해시 함수 (Hashed Password)
정의
해시 함수는 임의의 길이를 가진 입력 데이터를 고정된 길이의 출력 데이터(해시 값)로 변환하는 알고리즘입니다. 암호화된 해시 함수는 암호학적으로 강력한 해시 함수로, 다음의 특성을 가집니다:
- 결정적(deterministic): 같은 입력은 항상 같은 해시 값을 생성합니다.
- 충돌 저항성(collision resistance): 서로 다른 입력이 같은 해시 값을 생성할 확률이 매우 낮습니다.
- 역산 저항성(pre-image resistance): 해시 값으로부터 원래 입력을 유추하는 것이 어렵습니다.
- 수정 저항성(2nd pre-image resistance): 기존 해시 값을 가진 다른 입력을 찾는 것이 어렵습니다.
목적
- 사용자 비밀번호를 서버에 평문으로 저장하지 않고 해시 값으로 저장합니다.
- 해시 값은 원본 데이터를 복원할 수 없기 때문에, 데이터가 유출되더라도 비밀번호를 바로 알아내기 어렵습니다.
사용 예
- SHA-256, bcrypt, Argon2와 같은 암호화 해시 함수가 일반적으로 사용됩니다.
2. 패스워드 솔트 (Password Salt)
정의
솔트는 비밀번호에 임의의 데이터를 추가하여 고유한 입력값을 생성하는 기법입니다. 솔트는 보통 각 사용자 계정마다 다르게 생성됩니다.
목적
- 동일한 비밀번호라도 솔트 값이 다르면 서로 다른 해시 값을 생성합니다.
- 레인보우 테이블(Rainbow Table) 공격(미리 계산된 해시 값으로 비밀번호를 역추적)을 방지합니다.
- 해시 충돌 방지: 두 사용자가 동일한 비밀번호를 사용해도 서로 다른 해시 값을 생성하도록 만듭니다.
작동 방식
- 사용자가 비밀번호를 입력하면, 서버는 해당 사용자에 대한 솔트 값을 가져옵니다.
- 솔트 값과 비밀번호를 결합하여 해시 함수에 전달합니다.
- 생성된 해시 값을 저장하거나 비교합니다.
예시 코드
const crypto = require('crypto');
// 솔트 생성
const generateSalt = () => {
return crypto.randomBytes(16).toString('hex');
};
// 비밀번호와 솔트를 결합하여 해시 생성
const hashPassword = (password, salt) => {
return crypto.pbkdf2Sync(password, salt, 100000, 64, 'sha256').toString('hex');
};
// 예제 사용
const password = "user_password";
const salt = generateSalt();
const hashedPassword = hashPassword(password, salt);
console.log("Salt:", salt);
console.log("Hashed Password:", hashedPassword);
3. 암호화 해시 함수와 패스워드 솔트의 조합
과정
- 솔트를 생성하고 사용자 데이터베이스에 저장합니다.
- 사용자가 비밀번호를 입력하면, 솔트 값을 가져와 비밀번호와 결합합니다.
- 결합된 데이터를 해시 함수로 처리하여 해시 값을 생성합니다.
- 데이터베이스에 저장된 해시 값과 비교하여 인증을 수행합니다.
장점
- 단순한 해시보다 안전합니다.
- 공격자가 비밀번호 데이터베이스를 확보해도 각 계정마다 솔트가 다르므로 해독이 어렵습니다.
주의사항
- 솔트는 반드시 안전하게 저장해야 하며, 사용자마다 고유해야 합니다.
- 적절한 해시 함수(예: bcrypt, Argon2)를 사용해야 합니다. 단순한 해시 알고리즘(SHA-1, MD5 등)은 안전하지 않습니다.
결론
암호화된 해시 함수와 패스워드 솔트를 사용하면 비밀번호를 안전하게 저장할 수 있습니다. 이를 통해 해커로부터 사용자 계정 정보를 보호하고 인증 시스템의 보안을 강화할 수 있습니다.
Leave a comment