본문 바로가기
Python 문법/Python 기본 문법(3.10 기준)

[python3.10 기본] 24. 보안

by cogito21_python 2024. 7. 2.
반응형

24.1 암호화와 해싱 (hashlib, hmac, secrets 모듈)

hashlib 모듈

hashlib 모듈은 다양한 해시 알고리즘을 제공합니다. 해시는 입력 데이터를 고정된 길이의 바이트 문자열로 변환하는 데 사용됩니다.

해시 생성

import hashlib

data = "hello world"
hash_object = hashlib.sha256(data.encode())
hash_hex = hash_object.hexdigest()
print(hash_hex)  # sha256 해시 출력

hmac 모듈

hmac 모듈은 해시 기반 메시지 인증 코드(HMAC)를 생성하는 데 사용됩니다. HMAC은 메시지의 무결성과 진위성을 보장합니다.

HMAC 생성

import hmac
import hashlib

key = b'secret_key'
message = b'hello world'
hmac_object = hmac.new(key, message, hashlib.sha256)
hmac_hex = hmac_object.hexdigest()
print(hmac_hex)  # HMAC 출력

secrets 모듈

secrets 모듈은 암호학적으로 안전한 임의의 숫자와 문자열을 생성하는 데 사용됩니다.

안전한 임의의 문자열 생성

import secrets

secure_string = secrets.token_hex(16)
print(secure_string)  # 32자리의 16진수 문자열 출력

24.2 보안 관련 모범 사례

1. 입력 데이터 검증
모든 입력 데이터는 신뢰할 수 없으므로 철저히 검증해야 합니다. 이는 SQL 인젝션, XSS 등의 공격을 방지하는 데 중요합니다.

from werkzeug.security import check_password_hash

# 비밀번호 검증
def verify_password(stored_password_hash, provided_password):
    return check_password_hash(stored_password_hash, provided_password)

2. 암호 저장
비밀번호는 평문으로 저장하지 않고, 안전한 해시 함수(예: bcrypt, scrypt, Argon2)를 사용하여 해싱된 상태로 저장해야 합니다.

from werkzeug.security import generate_password_hash, check_password_hash

password = "user_password"
password_hash = generate_password_hash(password)
print(password_hash)

3. HTTPS 사용
애플리케이션과 서버 간의 데이터 전송은 HTTPS를 통해 암호화해야 합니다.

4. 민감한 정보 보호
API 키, 비밀번호, 암호화 키와 같은 민감한 정보는 소스 코드에 직접 포함하지 않고 환경 변수 등을 통해 관리해야 합니다.

5. 보안 업데이트 적용
파이썬 및 사용 중인 라이브러리의 최신 보안 패치를 적용하여 알려진 취약점을 방지해야 합니다.

24.3 웹 애플리케이션 보안 (OWASP Top 10)

OWASP(Open Web Application Security Project)는 웹 애플리케이션의 보안 취약점에 대한 가이드라인을 제공합니다. OWASP Top 10은 가장 일반적인 웹 애플리케이션 보안 취약점을 다룹니다.

SQL 인젝션

  • 공격자가 악성 SQL 코드를 삽입하여 데이터베이스를 조작할 수 있는 취약점입니다.
  • 방지 방법: 파라미터화된 쿼리, ORM 사용.
import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 안전한 쿼리
cursor.execute("SELECT * FROM users WHERE username=?", (username,))

크로스 사이트 스크립팅(XSS)

  • 공격자가 악성 스크립트를 웹 페이지에 삽입하여 다른 사용자에게 실행되게 하는 취약점입니다.
  • 방지 방법: 사용자 입력 데이터의 이스케이프 처리, Content Security Policy(CSP) 적용.
from markupsafe import escape

# 사용자 입력을 이스케이프 처리하여 XSS 방지
safe_input = escape(user_input)

크로스 사이트 요청 위조(CSRF)

  • 사용자가 모르는 사이에 공격자가 인증된 사용자의 권한을 도용하여 요청을 수행하는 취약점입니다.
  • 방지 방법: CSRF 토큰 사용.
from flask import Flask, session, request, abort

app = Flask(__name__)
app.secret_key = 'super_secret_key'

@app.before_request
def check_csrf():
    if request.method == "POST":
        token = session.pop('_csrf_token', None)
        if not token or token != request.form.get('_csrf_token'):
            abort(403)

def generate_csrf_token():
    token = secrets.token_hex(16)
    session['_csrf_token'] = token
    return token

app.jinja_env.globals['csrf_token'] = generate_csrf_token

인증 및 세션 관리 취약점

  • 비밀번호와 세션 관리를 잘못하여 발생하는 취약점입니다.
  • 방지 방법: 안전한 비밀번호 저장, 세션 타임아웃 설정.

기타 OWASP Top 10 항목

  • 취약한 구성 설정
  • 민감 데이터 노출
  • 접근 제어 실패
  • 안전하지 않은 디폴트 설정
  • 보안 모니터링 및 로깅 실패
  • 보안 설정 검토 및 유지관리 실패

 

반응형