[SEC-002][입문] 비밀번호·해시·MFA 안전하게 이해하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[SEC-002][입문] 비밀번호·해시·MFA 안전하게 이해하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 252회 작성일 26-08-30 00:35

본문

[이번 수업]

서비스가 비밀번호 원문 대신 salt와 느린 해시를 저장해야 하는 이유를 배우고, MFA가 서로 다른 인증 요소를 결합하는 방식을 이해합니다. 실습에는 실제 비밀번호가 아닌 공개된 연습용 문자열만 사용합니다.

[선수지식]

SEC-001의 자산·위협·취약점 개념과 Python 문자열·함수 기초를 알면 됩니다. 외부 패키지는 필요하지 않습니다.

[학습목표]

1. 해시와 암호화의 목적 차이를 설명한다.
2. salt와 작업 비용이 비밀번호 추측을 어렵게 하는 방식을 이해한다.

4. 지식·소지·생체 요소와 피싱 저항성 MFA를 구분한다.

[핵심개념]

비밀번호 저장용 해시는 입력에서 고정 길이 값을 만드는 단방향 계산입니다. 로그인 때 입력한 비밀번호를 같은 조건으로 다시 계산해 저장값과 비교하므로 서버가 원문을 복호화할 필요가 없습니다. 단순 SHA-256처럼 빠른 해시는 공격자가 많은 후보를 빠르게 시험할 수 있어 비밀번호 저장에 적합하지 않습니다. Argon2id나 scrypt처럼 의도적으로 시간과 메모리를 쓰는 전용 함수를 사용해야 합니다.

salt는 각 비밀번호마다 새로 만드는 무작위 값입니다. 비밀일 필요는 없으며 해시와 함께 저장합니다. 같은 비밀번호라도 salt가 다르면 결과가 달라져 미리 계산한 표를 재사용하기 어려워집니다.

사용자는 서비스마다 다른 긴 암호구문을 비밀번호 관리자에서 생성·보관하는 편이 좋습니다. 서비스는 흔하거나 유출된 비밀번호 차단목록을 확인하고, 침해 증거가 없다면 의미 없는 주기적 변경을 강요하지 않는 것이 현재 NIST 지침입니다.

MFA는 다중요소 인증입니다. 내가 아는 것인 비밀번호, 내가 가진 것인 보안키·등록 기기, 나 자신인 생체 특징 중 서로 다른 종류를 결합합니다. 비밀번호 두 개는 모두 지식 요소라 MFA가 아닙니다. WebAuthn 기반 패스키·보안키처럼 공개키와 사이트 출처를 사용하는 방식은 피싱 저항성을 높일 수 있습니다.

[따라하기]

password_demo.py에 다음을 저장하세요. 연습 문자열을 실제 계정에서 재사용하지 마세요.

from hashlib import scrypt
from hmac import compare_digest
from secrets import token_bytes

N = 2 ** 17
R = 8
P = 1

def derive(password, salt):
    return scrypt(
        password.encode("utf-8"),
        salt=salt,
        n=N, r=R, p=P, dklen=32,
        maxmem=256 * 1024 * 1024,
    )

salt = token_bytes(16)
stored = derive("연습용-긴-암호구문", salt)

correct = derive("연습용-긴-암호구문", salt)
wrong = derive("틀린-연습용-문구", salt)

print("salt bytes:", len(salt))
print("hash bytes:", len(stored))
print("correct:", compare_digest(stored, correct))
print("wrong:", compare_digest(stored, wrong))

Windows는 py password_demo.py, macOS·Linux는 python3 password_demo.py로 실행합니다. 계산에 메모리를 사용하므로 몇 초 걸릴 수 있습니다. 예상 결과는 salt 16바이트, 해시 32바이트, correct는 True, wrong은 False입니다. N=2^17, r=8, p=1은 Argon2id를 사용할 수 없을 때 OWASP가 제시하는 scrypt 최소 구성입니다.

[흔한 실수]

첫째, 비밀번호를 평문이나 복호화 가능한 형태로 저장합니다. 둘째, 일반 SHA-256을 한 번만 계산합니다. 셋째, 모든 계정에 같은 salt를 씁니다.

[보안 주의]

실제 비밀번호, salt, 해시, MFA 비밀키, 복구 코드를 예제·로그·화면 공유에 넣지 마세요.

[직접 해볼 과제]

같은 연습용 암호구문으로 salt를 두 번 새로 만들어 해시가 서로 다른지 확인하세요. 이어서 인증 정책 체크리스트에 비밀번호 관리자 허용, 유출 비밀번호 차단, 피싱 저항성 MFA 선택지, 복구 코드 보관, 시도 제한을 적으세요.

[확인문제]

1. 비밀번호 저장에 빠른 일반 해시보다 느린 전용 해시가 필요한 이유는 무엇인가요?
2. salt는 비밀인가요, 그리고 계정마다 달라야 하는 이유는 무엇인가요?
3. 비밀번호 두 개가 MFA가 아닌 이유와 피싱 저항성 방식의 예는 무엇인가요?

[다음 학습]

순환 커리큘럼의 다음 글은 AI-002 데이터셋·특징·라벨·학습과 추론입니다. 보안 트랙에서는 SEC-003 인증과 인가·최소 권한으로 이어집니다.

[공식 참고 자료]

NIST SP 800-63B 디지털 신원 지침
https://pages.nist.gov/800-63-4/sp800-63b.html

OWASP 비밀번호 저장 가이드
https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html

RFC 9106 Argon2
https://www.rfc-editor.org/rfc/rfc9106.html

Python hashlib.scrypt
https://docs.python.org/3/library/hashlib.html#hashlib.scrypt

Python hmac.compare_digest
https://docs.python.org/3/library/hmac.html#hmac.compare_digest

W3C WebAuthn Level 3
https://www.w3.org/TR/webauthn-3/

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
715
어제
5,103
최대
16,772
전체
771,769
Copyright © 소유하신 도메인. All rights reserved.