Python을 사용하는 당신, 지금까지 내장 해시 함수가 얼마나 안전한지 생각해본 적 있으신가요?
2022년 발생한 SHA3의 보안 취약점(CVE) 이후, Python은 결단을 내렸습니다.
"이제는 검증된 암호화 코드만 쓰자."
그리고 2년 반이 흐른 2025년 4월, 드디어 그 약속이 현실이 되었습니다.
Python은 이제 해시와 HMAC 알고리즘 전반에 걸쳐 모두 검증된 암호화 라이브러리인 HACL*을 사용합니다.
15,000줄에 달하는 안전하게 입증된 코드가 Python에 통합됐고, 그 과정은 사용자에게 완전히 투명하게 이루어졌습니다.
이 블로그에서는:
- Python이 왜 이런 결정을 내렸는지
- HACL*은 무엇인지
- 어떤 기술적 난관이 있었고 어떻게 해결했는지
- 그리고 이것이 여러분에게 어떤 의미가 있는지
쉽고, 명확하게 설명해드립니다.
🔐 HACL*이란 무엇인가요? 그리고 왜 중요한가요?
HACL*은 Microsoft Research와 INRIA 연구진들이 공동 개발한 형식 검증(Formal Verification) 기반의 암호화 라이브러리입니다.
쉽게 말해, 수학적으로 안전성이 입증된 암호화 코드입니다.
이번에 Python에 통합된 코드는 다음과 같은 특징을 갖고 있습니다:
- SHA3, SHA2, Blake2, HMAC 등 다양한 알고리즘을 포함
- 철저하게 검증된 15,000줄의 C 코드
- Python에서 자동화된 스크립트로 HACL*의 최신 버전을 가져올 수 있도록 설계됨
이전에는 검증되지 않은 코드가 일부 포함돼 있어, 2022년 SHA3 취약점처럼 보안 사고가 발생할 여지가 있었습니다.
이제는 그 가능성을 구조적으로 차단하게 된 것입니다.
🧱 스트리밍 API: 복잡한 알고리즘을 단순하게 만드는 열쇠
암호화 알고리즘은 일반적으로 블록 단위로 데이터를 처리합니다.
하지만 현실에서는 데이터를 블록 단위로 미리 나눌 수 없는 경우가 많습니다. 이럴 때 필요한 것이 스트리밍 API입니다.
왜 스트리밍 API는 어렵고 중요한가?
- 중간 상태 유지: TLS 같은 프로토콜에서 중간 해시 값을 계속 계산해야 하는 경우, 상태가 쉽게 무효화될 수 있습니다.
- 다양한 처리 방식: Blake2는 마지막 블록이 비어 있으면 안 되지만, SHA3는 허용하는 등 알고리즘마다 처리 방식이 다릅니다.
- 키 관리의 복잡성: HMAC처럼 키를 유지해야 하는 경우도 있고, Poly1305처럼 키를 초기화 후 바로 버리는 경우도 있습니다.
이러한 복잡성 때문에 스트리밍 API는 종종 버그와 보안 이슈의 온상이 됩니다.
실제로 2022년 Python이 사용하던 SHA3 스트리밍 API에서도 취약점이 발생했죠.
HACL* 팀은 이 문제를 해결하기 위해 스트리밍 API의 핵심 동작을 제네릭하게 추상화하고, 그 위에서 각 알고리즘을 인스턴스화하는 방식을 채택했습니다.
✅ 검증된 코드란, 진짜 ‘수학적으로’ 입증된 코드입니다
“검증됐다”는 말, 어디까지 믿을 수 있을까요?
HACL*의 코드는 단순히 테스트를 통과한 수준이 아닙니다.
F*라는 함수형 언어로 작성된 후, 해당 코드가 지정한 보안 속성을 항상 만족한다는 것을 증명한 뒤 C 코드로 변환됩니다.
검증을 통해 다음을 보장합니다:
- 메모리 안전성: 버퍼 오버플로우 불가
- 상태 일관성 유지: 잘못된 순서의 API 호출 방지
- 알고리즘 특성 보존: 키, 초기화 입력, 블록 경계 등 세세한 사항까지 정확하게 구현
이런 방식은 학술 논문에서만 존재할 것 같지만, Python은 이제 이를 실제로 사용합니다.
🛠️ Python 통합 과정의 기술적 도전과 해결 전략
빌드 시스템과 AVX2 이슈
Python은 50개 이상의 아키텍처와 툴체인에서 CI를 돌립니다.
특정 알고리즘(HMAC-Blake2b)은 AVX2 명령어를 쓰는 구현도 필요합니다. 하지만 모든 플랫폼이 AVX2를 지원하는 것은 아니죠.
이 문제를 해결하기 위해, HACL* 팀은 C의 추상 구조체 패턴을 사용해 AVX2 전용 구현과 일반 구현을 완전히 분리하는 방식으로 구조를 개편했습니다.
즉, AVX2가 없는 환경에서도 문제없이 동작하게 만든 것입니다.
메모리 할당 실패 처리
Python은 메모리 할당이 실패할 경우에도 명확한 오류 처리를 기대합니다.
이를 위해, 전체 스트리밍 API에서 메모리 할당 실패가 발생할 수 있는 경로에 대해 **옵션 타입(Tagged union)**을 추가했고, 모든 알고리즘에 반영했습니다.
자동 업데이트
Python은 이제 HACL*의 최신 버전을 자동으로 받아오는 스크립트를 포함합니다.
보안 패치나 알고리즘 개선이 이루어지면, Python도 쉽게 최신 상태로 유지할 수 있게 된 것이죠.
👨💻 Python 사용자에게 어떤 의미가 있을까?
- ✅ 보안 강화: 기본 제공 암호화 함수만 써도 높은 보안 보장
- 🔄 완전한 하위 호환성: 기존 코드 수정 없이 적용 가능
- 🧩 확장성 확보: 다양한 해시 알고리즘과 모드, HMAC 최적화 지원
- 🧘♂️ 개발자 부담 감소: 검증된 코드 덕분에 보안상 실수 위험 최소화
특히 보안이 중요한 인증 시스템, 토큰 기반 인증, TLS 핸들링 등의 코드를 Python으로 작성 중이라면, 이번 변화는 상당히 반가운 소식일 것입니다.
보안이 기본값인 시대, Python이 시작했습니다
이번 업데이트는 단순한 기능 개선이 아닙니다.
Python은 이제 보안이 보장된 암호화 코드를 기본값으로 채택한 언어가 되었습니다.
오픈소스 프로젝트에서 흔치 않은 이 정도 수준의 검증은, 향후 다른 프로젝트에도 큰 영감을 줄 것입니다.
보안에 신경 써야 할 필요조차 줄어드는 세상.
이제 Python에서는 믿고 쓸 수 있는 기본 보안이 제공됩니다.
기대되는 점:
- 더 많은 언어와 프레임워크가 검증된 암호화 코드를 채택할 가능성
- 오픈소스에서도 고신뢰 소프트웨어가 표준이 되는 흐름 가속화
- Python 사용자들의 보안 실수 예방 및 코드 품질 향상
지금 사용 중인 Python 버전이 최신인지 확인해보세요.
이제부터는 여러분이 작성한 모든 해시, HMAC 관련 코드가 더 안전하게 실행되고 있습니다.
🔒 보안은 이제 기본값입니다.
https://jonathan.protzenko.fr/2025/04/18/python.html
15,000 lines of verified cryptography now in Python
In November 2022, I opened issue 99108 on Python’s GitHub repository, arguing that after a recent CVE in its implementation of SHA3, Python should embrace verified code for all of its hash-related infrastructure.
jonathan.protzenko.fr
'Python' 카테고리의 다른 글
Python을 실시간 하드웨어에서 직접 실행한다고? PyXL의 속도는 믿을 수 없을 만큼 빠르다 (0) | 2025.04.30 |
---|---|
몰랐던 Python의 숨은 고급 기능 14가지 – 실무에 바로 쓰는 예제와 함께 (0) | 2025.04.25 |
파이썬 f-string의 진화? 더 안전하고 유연한 t-string의 등장 (PEP 750 소개) (0) | 2025.04.12 |
Python 실행을 위한 새로운 패러다임! ForeverVM 완벽 가이드 (0) | 2025.03.07 |
파이썬 3.14, 코드 안 고쳐도 30% 빨라진다? – 새 인터프리터와 최적화 변화 완전 정리 (0) | 2025.02.17 |