PostgreSQL

PostgreSQL에서 안전한 비밀번호 관리: pgcrypto를 활용한 해싱

_Blue_Sky_ 2024. 12. 21. 11:50
728x90
728x90

 

PostgreSQL 데이터베이스에서 사용자의 비밀번호를 안전하게 관리하는 것은 매우 중요합니다. 만약 비밀번호가 평문으로 저장된다면, 데이터베이스가 해킹될 경우 모든 사용자의 비밀번호가 노출될 수 있는 심각한 문제가 발생할 수 있습니다. 이러한 위험을 방지하기 위해 PostgreSQL에서는 pgcrypto라는 확장 기능을 제공하여 비밀번호를 안전하게 해싱하는 기능을 지원합니다.

pgcrypto 확장 설치

pgcrypto 확장을 설치하면 PostgreSQL은 강력한 암호화 기능을 사용할 수 있게 됩니다. 설치는 다음과 같은 SQL 문장으로 간단하게 수행됩니다.

CREATE EXTENSION IF NOT EXISTS pgcrypto;

비밀번호 해싱 및 저장

pgcrypto를 설치한 후에는 crypt 함수와 gen_salt 함수를 사용하여 비밀번호를 해싱하고 저장할 수 있습니다.

 
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username TEXT NOT NULL UNIQUE,
    password TEXT NOT NULL
);

INSERT INTO users (username, password)
VALUES ('john_doe', crypt('secure_password123', gen_salt('bf')));
  • gen_salt('bf')는 Blowfish 알고리즘을 기반으로 강력한 솔트를 생성합니다.
  • crypt 함수는 생성된 솔트를 이용하여 비밀번호를 해시하고, 이 해시 값을 데이터베이스에 저장합니다.
728x90

비밀번호 검증

사용자가 로그인을 시도할 때, 입력한 비밀번호를 다시 해싱하여 데이터베이스에 저장된 해시 값과 비교합니다.

SELECT * FROM users
WHERE username = 'john_doe'
AND password = crypt('secure_password123', password);

위 쿼리에서 crypt('secure_password123', password) 부분은 입력된 비밀번호를 해시하고, 이를 데이터베이스에 저장된 해시 값과 비교합니다. 두 값이 일치하면 로그인이 성공적으로 처리됩니다.

프로시저를 이용한 구현

더욱 효율적인 비밀번호 관리를 위해 프로시저를 사용할 수 있습니다.

CREATE OR REPLACE FUNCTION register_user(u TEXT, p TEXT) RETURNS VOID AS $$
BEGIN
    INSERT INTO users (username, password)
    VALUES (u, crypt(p, gen_salt('bf')));
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION login_user(u TEXT, p TEXT) RETURNS BOOLEAN AS $$
DECLARE
    match BOOLEAN;
BEGIN
    SELECT EXISTS (
        SELECT 1 FROM users
        WHERE username = u
        AND password = crypt(p, password)
    ) INTO match;

    RETURN match;
END;
$$ LANGUAGE plpgsql;

위 프로시저를 사용하면 사용자 등록 및 로그인 기능을 간편하게 구현할 수 있습니다.

728x90

보안 팁

  • bcrypt 알고리즘: bcrypt는 현재 가장 안전한 해시 알고리즘 중 하나입니다.
  • 솔트 사용: 솔트를 사용하면 동일한 비밀번호라도 다른 해시 값을 생성하여 무차별 대입 공격을 더욱 어렵게 만듭니다.
  • 정기적인 비밀번호 변경: 사용자에게 주기적인 비밀번호 변경을 권장합니다.
  • 강력한 암호 정책: 최소 길이, 특수 문자 포함 등 강력한 암호 정책을 설정합니다.
  • 추가 보안 조치: 2단계 인증, IP 차단 등 추가적인 보안 조치를 고려합니다.

결론

pgcrypto를 사용하여 PostgreSQL에서 비밀번호를 안전하게 관리하는 방법에 대해 알아보았습니다. pgcrypto는 강력한 해싱 기능을 제공하여 데이터베이스에 저장된 비밀번호가 유출되더라도 쉽게 복호화될 수 없도록 보호합니다.

주의: 비밀번호 해싱은 데이터베이스 보안의 한 부분일 뿐입니다. 전체적인 시스템 보안을 위해서는 꾸준한 보안 점검과 업데이트가 필요합니다.

728x90
728x90