Created date: Dec 11 2024 Wednesday, 50th 08:23 #SLTMNG SUA USGM

연관 문서

개요

  • USGM 서비스 구조 상, 테이블에 GIT 계정 저장 필요
  • 테이블에 평문으로 저장하는게 아닌 암호화하여 저장 필요

비밀번호 보안 저장을 위한 주요 방법

비밀번호를 보안 문제 없이 저장하려면 평문 저장을 절대 금지하고, 대신 해시 함수를 이용해 비밀번호를 변환한 후 저장해야 합니다. 해시 함수는 입력값을 고정된 길이의 암호화된 데이터로 변환하며, 복호화가 불가능합니다.

  1. 해싱(Hashing)

    • 비밀번호는 SHA-256, bcrypt, PBKDF2, Argon2 같은 알고리즘을 사용해 해시로 변환합니다.
    • 해시는 복호화가 불가능하기 때문에 데이터 유출 시에도 안전합니다.
  2. Salt 추가

    • 해시 함수에 Salt(랜덤 문자열)를 추가해 동일한 비밀번호도 다른 해시 값을 생성합니다.
    • 무작위 대입 공격(Brute-force)과 레인보우 테이블 공격을 방어할 수 있습니다.
  3. 알고리즘 선택

    • bcrypt: 강력한 보안을 제공하며, Java에서는 BCrypt 라이브러리를 사용.
    • Argon2: 최신 알고리즘으로 메모리와 연산 비용을 조절 가능.
    • PBKDF2: 적절한 반복 횟수 설정을 통해 안전성 확보.

비밀번호 저장 예시 (Java로 해싱 및 Salt 적용)

Maven 의존성 추가

xml

<dependency>     <groupId>org.springframework.security</groupId>     <artifactId>spring-security-crypto</artifactId>     <version>6.1.2</version> <!-- 최신 버전으로 대체 --> </dependency>

Java 코드

java

import org.springframework.security.crypto.bcrypt.BCrypt; import java.util.UUID;  public class PasswordSecurity {     public static void main(String[] args) {         // 사용자 비밀번호         String plainPassword = "mySecurePassword";          // 1. Salt 생성         String salt = UUID.randomUUID().toString();          // 2. 비밀번호 해싱         String hashedPassword = BCrypt.hashpw(plainPassword + salt, BCrypt.gensalt());          // 3. 저장할 값 출력         System.out.println("Salt: " + salt);         System.out.println("Hashed Password: " + hashedPassword);          // 비밀번호 검증         boolean isPasswordMatch = BCrypt.checkpw(plainPassword + salt, hashedPassword);         System.out.println("비밀번호 일치 여부: " + isPasswordMatch);     } }

설명

  1. Salt 생성

    • UUID.randomUUID()를 이용해 랜덤 문자열 생성.
    • 비밀번호마다 고유한 Salt를 적용해 보안 강화.
  2. 해싱

    • BCrypt.hashpw()를 이용해 비밀번호 + Salt 조합을 해싱.
  3. 비밀번호 검증

    • BCrypt.checkpw()를 이용해 사용자가 입력한 비밀번호와 해시를 검증.

샘플 데이터 삽입

비밀번호를 “mySecurePassword”로 해싱했다고 가정:

sql

코드 복사

INSERT INTO users (user_id, user_name, email, password_hash, salt, created_at) VALUES ( 'user_01', 'David Kim', 'david.kim@example.com', '$2a$10$0fIjhOP93MzIjQhE.zq6OuNWnJd8xppTfM5Mz8knF.pj/V/rBX3Qe', -- 해시 값 '123e4567-e89b-12d3-a456-426614174000', -- Salt 값 '2024-12-11 10:00' );


보안 팁

  1. Salt 저장

    • Salt는 같은 테이블에 저장해도 문제가 없으므로 해시와 함께 관리.
  2. 해싱 알고리즘 유지

    • 오래된 해시 알고리즘(MD5, SHA1 등)을 사용하지 말고 최신 알고리즘으로 교체.
  3. 비밀번호 검증

    • 사용자가 입력한 비밀번호를 동일한 방식으로 해싱해 데이터베이스의 해시와 비교.

이 방식으로 비밀번호를 안전하게 저장하고 관리할 수 있습니다. 😊

연관 메일