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';
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;
실무 체크리스트
- 평문 저장 금지: 반드시 단방향 해시만 저장합니다.
- 전송 구간 보호: 로그인 요청은 HTTPS에서만 처리합니다.
- 재사용 방지: 비밀번호 변경 시 기존 해시와 동일하면 거부(사전/유출 리스트 점검 권장).
- 권한 최소화: 비밀번호 컬럼은 조회 권한을 엄격히 제한합니다.
자주 묻는 질문(FAQ)
Q1. PWDENCRYPT/PWDCOMPARE만 쓰면 충분한가요?
테이블 내부에서 간단히 검증할 때는 편리합니다. 다만 대규모 서비스나 보안 요구 수준이 높은 환경이라면 애플리케이션 레이어에서 솔트+스트레칭 알고리즘을 적용하는 설계를 권장합니다.
Q2. 기존 평문 비밀번호를 일괄 해시로 바꾸려면?
마이그레이션 스크립트로 UPDATE … SET USR_PWD = PWDENCRYPT(평문컬럼) 형태로 변환하고, 변환 후에는 평문 컬럼을 즉시 파기(삭제)하세요.
Q3. 인덱스는 어떻게 두나요?
일반적으로 USR_ID(로그인 키)에 인덱스를 두고, USR_PWD는 비교 조건으로만 사용합니다. 해시 자체에 인덱스는 불필요합니다.
함께 보면 좋은 게시글
- MSSQL 계정 암호 만료 강제 적용 및 암호 정책 강제 적용 방법
- MSSQL 계정 암호 만료일 확인 쿼리문 및 암호 변경 방법
- MSSQL 변수 – 선언(DECLARE), 대입(SET), 반환(SELECT)
- MSSQL 트리거(TRIGGER) 사용법(생성) 및 예제
- MSSQL 저장 프로시저 사용법(실행) 및 예제 (TRY…CATCH 등)
이 글이 도움이 되셨다면 공유 부탁 드립니다.


![[SSMS] 로컬 서버(PC)에 설치한 MSSQL 서버 연결하는 방법](https://bluesharehub.com/wp-content/uploads/2022/02/img_41.png)
