MSSQL 패스워드 컬럼 암호화 및 비교하기 - PWDENCRYPT, PWDCOMPARE

MSSQL 패스워드 컬럼 암호화 및 비교하기 – PWDENCRYPT, PWDCOMPARE

이 글은 사용자 테이블에 비밀번호를 저장할 때 PWDENCRYPT()로 단방향 해시를 만들고, 로그인 시 PWDCOMPARE()로 일치 여부를 확인하는 방법을 간단한 예제로 정리했습니다. 단방향 해시는 복호화가 불가능하며, 저장된 해시와 입력값을 비교만 합니다.

보안 팁:
업무 요건상 T-SQL에서 처리해야 하는 경우가 아니라면, 애플리케이션 레이어에서 솔트+스트레칭(PBKDF2/Argon2 등)을 사용하는 것이 일반적으로 더 권장됩니다.
아래 예제는 SQL Server 2019 기준으로 동작 확인을 위한 최소 샘플입니다.

1) PWDENCRYPT — 해시 생성

구문

PWDENCRYPT('password')

반환 형식: varbinary(128)

예제 – 사용자 비밀번호를 해시로 저장

-- 예: 사용자 계정 테이블에 단방향 해시 저장
UPDATE BS_USR_MAST
   SET USR_PWD = PWDENCRYPT('@A1234567')  -- 입력받은 평문 비밀번호 가정
 WHERE USR_ID  = 'blueshare';

-- 저장 결과 확인
SELECT USR_ID, USR_PWD
  FROM BS_USR_MAST
 WHERE USR_ID = 'blueshare';
PWDENCRYPT 예제: 비밀번호 해시가 varbinary로 저장된 화면

2) PWDCOMPARE — 입력값과 해시 비교

구문

PWDCOMPARE('clear_text_password', password_hash [, version])

반환 형식: int (일치하면 1, 불일치면 0)

예제 – 로그인 시 ID/비밀번호 검증

-- 1) 올바른 비밀번호
SELECT CASE WHEN COUNT(*) = 1 THEN '정상 접속'
            ELSE '사용자 ID 또는 비밀번호를 확인하세요' END AS login_result
  FROM BS_USR_MAST
 WHERE USR_ID = 'blueshare'
   AND PWDCOMPARE('@A1234567', USR_PWD) = 1;

-- 2) 잘못된 비밀번호
SELECT CASE WHEN COUNT(*) = 1 THEN '정상 접속'
            ELSE '사용자 ID 또는 비밀번호를 확인하세요' END AS login_result
  FROM BS_USR_MAST
 WHERE USR_ID = 'blueshare'
   AND PWDCOMPARE('@a1234567', USR_PWD) = 1;
PWDCOMPARE 예제: 일치/불일치 결과 비교 화면

실무 체크리스트

  • 평문 저장 금지: 반드시 단방향 해시만 저장합니다.
  • 전송 구간 보호: 로그인 요청은 HTTPS에서만 처리합니다.
  • 재사용 방지: 비밀번호 변경 시 기존 해시와 동일하면 거부(사전/유출 리스트 점검 권장).
  • 권한 최소화: 비밀번호 컬럼은 조회 권한을 엄격히 제한합니다.

자주 묻는 질문(FAQ)

Q1. PWDENCRYPT/PWDCOMPARE만 쓰면 충분한가요?

테이블 내부에서 간단히 검증할 때는 편리합니다. 다만 대규모 서비스나 보안 요구 수준이 높은 환경이라면 애플리케이션 레이어에서 솔트+스트레칭 알고리즘을 적용하는 설계를 권장합니다.

Q2. 기존 평문 비밀번호를 일괄 해시로 바꾸려면?

마이그레이션 스크립트로 UPDATE … SET USR_PWD = PWDENCRYPT(평문컬럼) 형태로 변환하고, 변환 후에는 평문 컬럼을 즉시 파기(삭제)하세요.

Q3. 인덱스는 어떻게 두나요?

일반적으로 USR_ID(로그인 키)에 인덱스를 두고, USR_PWD비교 조건으로만 사용합니다. 해시 자체에 인덱스는 불필요합니다.

함께 보면 좋은 게시글

위로 스크롤