"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 데이터베이스에 사용자 비밀번호를 안전하게 저장합니다

데이터베이스에 사용자 비밀번호를 안전하게 저장합니다

2025-04-19에 게시되었습니다
검색:396

1. 비밀번호 보안의 중요성 이해

보안 위반은 그 어느 때보 다 일반적이며 암호는 종종 체인에서 가장 약한 링크입니다. 공격자는 종종 무차별 인력 공격, 사전 공격 및 기타 방법을 사용하여 암호를 크랙합니다. 따라서 암호가 안전하게 저장되어 쉽게 손상 될 수 없는지 확인해야합니다.

Secure User Passwords in a Database

1.1 비밀번호 보안이 열악한 위험

비밀번호가 열악하면 데이터 유출, 신원 도용 및 상당한 재무 손실로 이어질 수 있습니다. 비밀번호를 일반 텍스트로 저장하거나 약한 해싱 알고리즘을 사용하거나 적절한 액세스 제어를 구현하지 않는 것은 치명적인 결과를 초래할 수있는 일반적인 실수 중 일부입니다.

1.2 암호 보안에서 해싱의 역할

해싱은 비밀번호를 고정 길이의 문자열로 변환하는 프로세스이며, 이는 리버스 엔지니어링이 거의 불가능합니다. 좋은 해시 함수는 계산, 결정 론적, 돌이킬 수 없으며 다른 입력에 대한 고유 한 출력을 생성하는 데 빠르야합니다.

2. 사용자 비밀번호를 보호하는 기술

데이터베이스에서 사용자 비밀번호를 보호하기위한 몇 가지 강력한 기술이 있습니다. 다음 섹션에서는 코드 예제, 데모 및 결과와 함께 이러한 기술을 자세히 다룹니다.

2.1 해싱 전에 비밀번호 소금

Secure User Passwords in a Database

SALTING은 해시 전에 암호에 임의의 데이터를 추가하는 과정입니다. 이 기술은 두 사용자가 동일한 암호를 가지고 있더라도 해시 값이 다르기 때문에 공격자가 공격에 미리 계산 된 해시 테이블 (레인보우 테이블)을 사용하기가 더 어려워집니다.

Java의 소금 및 해싱에 대한 예제 코드 :

import java.security.SecureRandom;
import java.security.MessageDigest;
import java.util.Base64;

public class PasswordSecurity {
    private static final String SALT_ALGORITHM = "SHA1PRNG";
    private static final String HASH_ALGORITHM = "SHA-256";

    public static String generateSalt() throws Exception {
        SecureRandom sr = SecureRandom.getInstance(SALT_ALGORITHM);
        byte[] salt = new byte[16];
        sr.nextBytes(salt);
        return Base64.getEncoder().encodeToString(salt);
    }

    public static String hashPassword(String password, String salt) throws Exception {
        MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM);
        md.update(salt.getBytes());
        byte[] hashedPassword = md.digest(password.getBytes());
        return Base64.getEncoder().encodeToString(hashedPassword);
    }

    public static void main(String[] args) throws Exception {
        String salt = generateSalt();
        String hashedPassword = hashPassword("mySecurePassword123", salt);
        System.out.println("Salt: "   salt);
        System.out.println("Hashed Password: "   hashedPassword);
    }
}

출력은 독특한 소금과 해시 암호를 보여 주므로 동일한 암호조차도 다른 소금으로 인해 해시가 다를 것입니다.

2.2 적응 형 해싱 알고리즘 사용 (Bcrypt, Scrypt, Argon2)

Secure User Passwords in a Database

bcrypt, scrypt 및 argon2와 같은 현대적인 해시 알고리즘은 특히 계산 집약적으로 설계되어 무차별적인 공격에 저항력이 있습니다. 이 알고리즘은 키 스트레칭과 같은 기술을 사용하며 시간이 지남에 따라 복잡성을 높이기 위해 조정할 수 있습니다.

Java에서 bcrypt를 사용한 예제 코드 :

import org.mindrot.jbcrypt.BCrypt;

public class BCryptExample {
    public static String hashPassword(String plainPassword) {
        return BCrypt.hashpw(plainPassword, BCrypt.gensalt(12));
    }

    public static boolean checkPassword(String plainPassword, String hashedPassword) {
        return BCrypt.checkpw(plainPassword, hashedPassword);
    }

    public static void main(String[] args) {
        String hashed = hashPassword("mySecurePassword123");
        System.out.println("Hashed Password: "   hashed);

        boolean isMatch = checkPassword("mySecurePassword123", hashed);
        System.out.println("Password Match: "   isMatch);
    }
}

해시 비밀번호가 표시되고 비밀번호 검증이 성공하여 암호 해싱을위한 BCrypt의 보안 및 효과를 보여줍니다.

2.3 Pepper : 추가 보안 계층

Secure User Passwords in a Database

Pepper는 해시 전에 비밀번호에 비밀 키 (Pepper라고도 함)를 추가하는 것과 관련이 있습니다. 고추는 해시 암호와 소금과 별도로 저장되며, 일반적으로 응용 프로그램 코드 또는 환경 변수에 추가 보안 계층이 추가됩니다.

구현 전략 :

  • 보안 랜덤 생성기를 사용하여 Pepper 키를 생성합니다.
  • 해시 전에 후추를 소금에 절인 암호에 추가하십시오.

2.4 비율 제한 및 계정 잠금 메커니즘 구현

강한 해싱과 소금을 조건하더라도 무차별 인력 공격은 위협으로 남아 있습니다. 속도 제한 구현 (예 : 로그인 시도 수 제한) 및 계정 잠금 장치는 이러한 위험을 완화하는 데 도움이됩니다.

Java의 계정 잠금에 대한 코드 예제 :

import java.util.HashMap;
import java.util.Map;

public class AccountSecurity {
    private static final int MAX_ATTEMPTS = 5;
    private Map loginAttempts = new HashMap();

    public boolean isAccountLocked(String username) {
        return loginAttempts.getOrDefault(username, 0) >= MAX_ATTEMPTS;
    }

    public void recordFailedAttempt(String username) {
        int attempts = loginAttempts.getOrDefault(username, 0)   1;
        loginAttempts.put(username, attempts);
    }

    public void resetAttempts(String username) {
        loginAttempts.put(username, 0);
    }
}

3. 비밀번호 보안을위한 모범 사례

강력한 보안을 보장하려면 다음과 같은 모범 사례를 따르십시오.

강력하고 독특한 소금과 고추를 사용

SALT는 비밀번호 입력 당 독특하고 안전한 랜덤 번호 생성기를 사용하여 생성해야합니다. 고추는 단단히 저장되어야하며 소스 코드에 절대 하드 코딩되어서는 안됩니다.

해싱 알고리즘을 정기적으로 업데이트합니다

해싱 알고리즘의 발전으로 최신 상태를 유지하고 새로운 공격 벡터에 대해 안전하게 유지하기 위해 필요한 경우 구현을 조정하십시오.

다중 인증 인증 구현 (mfa)

강력한 비밀번호 보안이 중요하지만 MFA 구현은 사용자에게 여러 형태의 검증을 제공하도록함으로써 추가 보안 계층을 추가합니다.

4. 결론

데이터베이스에서 사용자 비밀번호를 보호하는 것은 하나의 크기에 맞는 작업이 아닙니다. 강력한 보안을 보장하기 위해 기술과 관행의 조합이 필요합니다. SALTING을 구현하고, 적응 형 해싱 알고리즘을 사용하고, Pepper를 사용하고, 속도 제한 및 계정 잠금 메커니즘을 설정함으로써 개발자는 저장된 사용자 비밀번호의 보안을 크게 향상시킬 수 있습니다.

더 많은 것을 알고 싶거나 질문이 있습니까? 아래에 의견을 보내 주시기 바랍니다!

에서 더 많은 게시물 읽기

: 데이터베이스에서 사용자 비밀번호를 보안

릴리스 선언문 이 기사는 https://dev.to/anh_trntun_4732cf3d299/secure-user-passwords-in-a-database-51do ?1에서 재현됩니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3