OpenSSL API: 핵심 구조와 함정
EVP API, BIO 추상화, OpenSSL API의 가장 일반적인 오용 패턴을 익힙니다.
OpenSSL API: 핵심 구조와 함정은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
EVP API: 고수준 인터페이스
EVP(봉투) API는 OpenSSL의 암호화 작업을 위한 고수준 인터페이스이며 애플리케이션 코드에서 사용해야 하는 올바른 API입니다. 알고리즘별 세부 정보를 일관된 인터페이스 뒤에 추상화하고, 엔진 및 공급자 하드웨어 가속을 자동으로 지원하며, 패딩과 모드 세부 정보를 올바르게 처리합니다. OpenSSL의 저수준 알고리즘별 API는 최신 버전에서 사용 중단되었으므로 피해야 합니다.
대칭 암호화를 위한 EVP_CIPHER_CTX
OpenSSL의 대칭 암호화는 EVP_CIPHER_CTX 컨텍스트 객체를 사용합니다. 작업 순서는 다음과 같습니다. EVP_CIPHER_CTX_new로 컨텍스트를 할당하고, EVP_EncryptInit_ex로 암호와 키를 사용해 초기화하며, EVP_EncryptUpdate를 반복 호출하여 데이터를 처리하고, EVP_EncryptFinal_ex로 마지막 블록을 마무리하고 남은 출력을 가져온 후, EVP_CIPHER_CTX_free로 메모리를 해제합니다. EncryptFinal_ex를 건너뛰는 것은 출력이 잘린 결과를 만드는 흔한 실수입니다.
해싱을 위한 EVP_MD_CTX
메시지 다이제스트 계산도 EVP_MD_CTX를 사용하여 비슷한 방식으로 수행합니다. EVP_MD_CTX_new, 알고리즘과 함께 사용하는 EVP_DigestInit_ex(EVP_sha256(), EVP_sha3_256() 등), 데이터 조각과 함께 사용하는 EVP_DigestUpdate, 해시를 가져오는 EVP_DigestFinal_ex를 사용합니다. HMAC 작업에는 별도의 HMAC_CTX 또는 더 새로운 EVP_MAC API를 사용합니다. EVP 추상화를 사용하면 함수 호출 한 번만 변경하여 해시 알고리즘을 교체할 수 있습니다.
비대칭 키를 위한 EVP_PKEY
EVP_PKEY는 OpenSSL의 통합 비대칭 키 객체로, 단일 인터페이스에서 RSA, ECDSA, Ed25519, DH 및 기타 알고리즘을 지원합니다. PEM 또는 DER 파일에서 PEM_read_PrivateKey와 PEM_read_PUBKEY를 사용해 키를 생성하거나 EVP_PKEY_keygen으로 키를 생성할 수 있습니다. EVP_PKEY_sign과 EVP_PKEY_verify는 동일한 함수 호출을 사용하여 모든 키 유형의 서명과 검증을 수행합니다.
I/O를 위한 BIO 추상화
BIO(기본 I/O)는 BIO 객체 체인을 통해 TLS로 보호된 데이터 또는 원시 데이터를 읽고 쓸 수 있게 하는 OpenSSL의 I/O 추상화 계층입니다. BIO 체인은 BIO_new_ssl(TLS 계층)을 BIO_new_connect(TCP 연결)에 연결하는 형태일 수 있습니다. SSL BIO에 쓰면 데이터가 자동으로 암호화되어 전송되고, 읽으면 수신된 데이터가 복호화됩니다. BIO 객체는 파일, 소켓, 메모리 버퍼, 필터(base64, 버퍼링)를 지원합니다.
SSL_CTX 및 SSL 객체
OpenSSL의 TLS 연결은 두 객체를 사용합니다. SSL_CTX(컨텍스트)는 인증서, 개인 키, CA 번들, 프로토콜 버전 제한, 암호 목록과 같은 공유 구성을 저장합니다. SSL은 컨텍스트에서 파생된 개별 연결을 나타냅니다. 애플리케이션마다 SSL_CTX 하나를 만든 다음 각 연결에 사용할 SSL 객체를 그로부터 생성하십시오. SSL_read와 SSL_write는 평문을 전송하며, OpenSSL은 모든 TLS 프레이밍과 암호화를 내부적으로 처리합니다.
치명적 함정: 반환 값 무시하기
OpenSSL에서 가장 위험한 실수는 반환 값을 무시하는 것입니다. EVP_EncryptFinal_ex, SSL_read, SSL_write는 모두 오류를 나타내기 위해 음수 값 또는 0을 반환합니다. SSL_get_error를 확인하지 않고 SSL_read를 반복 호출하면 무한 루프가 발생하거나 오류를 놓칠 수 있습니다. 실패할 수 있는 모든 OpenSSL 함수의 반환 값을 확인해야 합니다. 실패는 핸드셰이크 실패나 인증서 검증 오류처럼 보안과 관련된 상태를 나타내는 경우가 많습니다.
함정: SSL_get_error 확인하지 않기
SSL_read와 SSL_write는 SSL_ERROR_WANT_READ 또는 SSL_ERROR_WANT_WRITE를 반환할 수 있으며, 이는 I/O를 기다린 후 작업을 다시 시도해야 함을 나타냅니다. 이는 실제 오류가 아니라 비차단 I/O 알림입니다. SSL_get_error를 호출하지 않고 읽기 대기/쓰기 대기 상태에 따라 올바르게 분기하지 않는 코드는 바쁜 대기 루프를 실행하거나 이러한 상태를 잘못 오류로 처리하게 됩니다. TLS I/O 작업의 음수 반환 값을 해석할 때는 항상 SSL_get_error를 사용하십시오.
사용 중단된 저수준 API
OpenSSL에는 새 코드에 사용해서는 안 되는 사용 중단된 저수준 함수가 많습니다. 예를 들면 DES_encrypt1을 직접 호출하거나, EVP 계층 없이 SHA1 또는 MD5 해시 함수를 직접 사용하거나, EVP_PKEY_sign 대신 RSA_private_encrypt를 사용하거나, AES_encrypt를 사용하는 경우입니다(AES ECB이며 인증이 없음). 이러한 API는 보안 검사를 우회하거나 사용 중단된 알고리즘을 사용하거나, EVP에 대응하는 API보다 단순히 안전성이 낮습니다. 컴파일러 경고는 사용 중단된 API 사용을 표시하는 경우가 많습니다.
OpenSSL 코드의 메모리 누수
OpenSSL은 명시적 메모리 관리를 사용하므로 할당된 모든 객체를 명시적으로 해제해야 합니다. 흔한 메모리 누수로는 암호화 후 EVP_CIPHER_CTX_free를 호출하지 않거나, 연결을 닫은 후 SSL_free를 호출하지 않거나, 인증서 검증 후 X509_free를 호출하지 않는 경우가 있습니다. 장시간 실행되는 서버에서는 이러한 누수로 메모리가 점차 고갈됩니다. 개발 중에는 valgrind나 AddressSanitizer와 같은 도구를 사용하여 OpenSSL 메모리 누수를 감지하십시오.
OpenSSL 3.0 공급자 모델
OpenSSL 3.0은 하드웨어 가속을 위한 기존 ENGINE API를 대체하는 공급자 모델을 도입했습니다. 공급자는 암호화 알고리즘을 구현하는 로드 가능한 모듈입니다. 기본 공급자(소프트웨어), 레거시 공급자(이전 알고리즘), FIPS 공급자(FIPS 140-2 검증), HSM용 타사 공급자가 있습니다. FIPS 공급자는 FIPS 140-2에서 승인한 알고리즘으로 사용 가능한 알고리즘을 제한하여, 애플리케이션 코드를 변경하지 않고도 규정을 준수하는 작업을 수행할 수 있게 합니다.
EVP API의 중요성
알고리즘별 저수준 API보다 OpenSSL EVP API가 선호되는 이유는 무엇입니까?
OpenSSL API 요약
OpenSSL API 요약: 항상 EVP 고수준 API를 사용하고, 대칭 작업에는 EVP_CIPHER_CTX를, 해싱에는 EVP_MD_CTX를, 비대칭 키에는 EVP_PKEY를 사용하며, I/O 추상화에는 BIO 체인을 사용하고 TLS 연결에는 SSL_CTX와 SSL을 사용하십시오. 항상 반환 값을 확인하고 SSL_get_error를 호출하며, 누수를 방지하기 위해 할당된 모든 객체를 해제하고, 사용 중단된 저수준 함수를 피하며, FIPS 준수 또는 하드웨어 가속을 위해 OpenSSL 3.0 공급자를 사용하십시오.
자주 묻는 질문
“OpenSSL API: 핵심 구조와 함정” 강의는 무료인가요?
네 — “OpenSSL API: 핵심 구조와 함정” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“OpenSSL API: 핵심 구조와 함정”에서 뭘 배우나요?
EVP API, BIO 추상화, OpenSSL API의 가장 일반적인 오용 패턴을 익힙니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“OpenSSL API: 핵심 구조와 함정” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- libsodium: 오용 방지 암호 라이브러리
- OpenSSL API: 핵심 구조와 함정
- Google Tink: 안전한 고수준 암호
- 암호 의존성 감사와 선택