OpenSSL 을 활용한 암호화 입문

LinuxBeginner
지금 연습하기

소개

이 실습에서는 안전한 통신과 데이터 보호를 위해 널리 사용되는 도구인 OpenSSL 을 사용하여 암호화의 기초를 배웁니다. 암호화가 어떻게 읽을 수 있는 데이터를 안전한 형식으로 변환하여, 데이터가 중간에 가로채어지더라도 기밀성을 유지하는지 탐구하게 됩니다.

이 실습 과정을 통해 OpenSSL 설치, 대칭 키 암호화 수행, 그리고 키를 안전하게 관리하는 방법을 단계별로 익힐 수 있습니다. 실습을 마칠 때쯤이면 온라인 뱅킹이나 메시징 서비스와 같은 실제 응용 분야에서 이러한 기술들이 민감한 정보를 어떻게 보호하는지 이해하게 될 것입니다.

OpenSSL 설치하기

메시지 암호화를 시작하기 전에 시스템에 OpenSSL 을 설치해야 합니다. OpenSSL 은 전송 계층 보안 (TLS) 및 보안 소켓 계층 (SSL) 프로토콜을 위한 강력하고 기능이 풍부한 도구 모음이며, 범용 암호화 라이브러리이기도 합니다. 디지털 통신을 보호하는 데 필요한 모든 도구가 들어 있는 공구 상자라고 생각하면 됩니다.

  1. 먼저 터미널을 엽니다. 터미널은 모든 OpenSSL 명령어를 실행할 장소입니다. 이번 실습 환경과 같은 리눅스 시스템에서 터미널은 시스템 도구와 상호작용하는 주요 수단입니다. 데스크톱에서 Xfce Terminal 을 찾아 실행하세요. 터미널 사용이 처음이더라도 걱정하지 마세요. 모든 단계를 차근차근 안내해 드립니다.
Xfce Terminal window open

참고: 무료 사용자는 인터넷 연결이 제한되므로 실습 환경에 OpenSSL 이 이미 사전 설치되어 있습니다. 목록의 4 번 항목 (OpenSSL 설치 여부 확인) 으로 바로 넘어가셔도 됩니다. 직접 OpenSSL 설치를 연습해보고 싶다면 Pro 사용자로 업그레이드하세요.

Pro 사용자 전용
  1. 터미널이 열리면 패키지 목록을 업데이트해야 합니다. 이는 물건을 구매하기 전에 사용 가능한 소프트웨어 카탈로그를 최신 상태로 갱신하는 것과 같습니다. 다음 명령어를 입력하고 Enter 를 누르세요.
sudo apt-get update

sudo 는 윈도우의 "관리자 권한으로 실행"과 유사하게 관리자 권한을 부여합니다. 시스템에서 비밀번호를 요구할 수 있는데, 이는 정상적인 보안 절차입니다. 리눅스 터미널에서 비밀번호를 입력할 때는 화면에 아무런 글자도 표시되지 않습니다. 처음에는 생소할 수 있지만 이는 보안을 위한 의도적인 설계입니다.

  1. 패키지 목록이 업데이트되었으므로 이제 OpenSSL 을 설치해 보겠습니다. 다음 명령어를 입력하세요.
sudo apt-get install openssl -y

-y 플래그는 설치 과정에서 나타나는 모든 확인 질문에 자동으로 "예"라고 응답합니다. 화면에 많은 텍스트가 지나가는 것을 볼 수 있는데, 이는 시스템이 OpenSSL 과 그 의존성 파일들을 다운로드하고 설정하는 과정입니다. 각 줄은 설치 프로세스의 각 단계를 나타냅니다.

  1. 설치가 완료되면 OpenSSL 이 제대로 설치되었는지 확인해야 합니다. 이는 새 가전제품을 콘센트에 꽂은 후 제대로 작동하는지 확인하는 것과 같습니다. 다음을 입력하세요.
openssl version

다음과 유사한 출력이 나타나야 합니다.

OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

정확한 버전 번호는 다를 수 있지만, 버전 정보가 출력된다면 정상입니다. 이 출력은 OpenSSL 이 설치되어 사용할 준비가 되었음을 알려줍니다.

  1. 잘하셨습니다! 이제 OpenSSL 설치를 마쳤습니다. 이 도구 모음을 사용하여 다양한 암호화 작업을 수행할 것입니다. 다음 섹션에서는 보안 통신의 작동 원리를 이해하는 데 필수적인 메시지 암호화 및 복호화 과정을 진행해 보겠습니다.

OpenSSL 의 전체 기능이 궁금하다면 man openssl을 입력하여 매뉴얼을 살펴볼 수 있습니다. 이 문서에는 사용 가능한 모든 명령어와 옵션이 포함되어 있습니다. 지금은 내용이 방대해 보일 수 있으므로, 이 실습에서는 암호화 지식을 단계별로 쌓을 수 있도록 실용적이고 자주 사용되는 기능에 집중하겠습니다.

비밀 메시지 생성하기

OpenSSL 설치를 마쳤으니, 이제 나중에 암호화할 첫 번째 비밀 메시지를 만들어 보겠습니다. 암호화가 어떻게 작동하는지 이해하기 위해 암호화할 대상 (데이터) 을 준비하는 중요한 첫 단계입니다.

  1. 먼저 컴퓨터의 올바른 위치에 있는지 확인해야 합니다. 터미널에 다음을 입력하세요.

    cd ~/project

    이 명령어는 현재 디렉토리를 홈 디렉토리 내의 project 폴더로 변경합니다 (cd는 'change directory'의 약자입니다). ~ 기호는 "홈 디렉토리"를 의미하는 약어입니다. 올바른 디렉토리에서 작업하면 파일을 체계적으로 관리할 수 있고 다음 단계들을 진행하기 수월해집니다.

  2. 이제 비밀 메시지를 만들어 보겠습니다. echo라는 명령어를 사용합니다. 다음을 입력하세요.

    echo "LabEx has the best labs for fun, hands-on learning." > secret.txt

    각 부분의 역할을 살펴보겠습니다.

    • echo: 텍스트를 터미널에 출력하는 기본 명령어입니다.
    • 따옴표 안의 텍스트: 우리가 보호하고자 하는 비밀 메시지 내용입니다.
    • > 기호: 출력을 화면에 보여주는 대신 파일로 저장 (리다이렉션) 합니다.
    • secret.txt: 메시지가 저장될 파일의 이름입니다.
  3. 좋습니다! 파일이 생성되었습니다. 하지만 제대로 작동했는지 어떻게 확인할까요? 파일 내용을 확인해 봅시다.

    cat secret.txt

    cat 명령어 ('concatenate'의 약자) 는 파일의 내용을 화면에 표시합니다. 이 명령어를 실행했을 때 터미널에 입력했던 비밀 메시지가 그대로 나타난다면 파일이 올바르게 생성된 것입니다.

  4. 현재 이 메시지는 암호학에서 말하는 "평문 (plaintext)" 상태로 저장되어 있습니다. 즉, 파일에 접근할 수 있는 사람이라면 누구나 내용을 읽을 수 있다는 뜻입니다. 지금은 괜찮지만, 실제 상황에서 민감한 정보는 절대로 이런 방식으로 저장해서는 안 됩니다. 다음 단계에서는 OpenSSL 을 사용하여 이 평문을 암호화를 통해 안전한 암호문으로 변환해 보겠습니다.

OpenSSL 로 메시지 암호화하기

이제 평문 메시지를 올바른 비밀번호가 있어야만 읽을 수 있는 암호화된 데이터로 변환해 보겠습니다. 이 과정을 암호화라고 하며, 디지털 통신에서 정보를 안전하게 보호하는 핵심 기술입니다.

  1. 우리는 업계 표준 방식인 AES-256-CBC 암호화를 사용할 것입니다. 이 용어의 각 의미를 이해해 봅시다.

    • AES (Advanced Encryption Standard): 기밀 정보를 보호하기 위해 미국 정부에서 승인한 대칭 키 암호화 알고리즘입니다.
    • 256: 비트 단위의 키 길이입니다. 키가 길수록 보안성이 더 강력해집니다.
    • CBC (Cipher Block Chaining): 각 데이터 블록이 이전 블록에 의존하도록 만들어 보안성을 높이는 운영 모드입니다.
  2. 파일을 암호화하기 위해 다음 OpenSSL 명령어를 사용합니다.

    openssl enc -aes-256-cbc -salt -in secret.txt -out secret.enc -pbkdf2

    각 옵션의 역할은 다음과 같습니다.

    • openssl enc: OpenSSL 의 암호화 기능을 호출합니다.
    • -aes-256-cbc: 선택한 암호화 방식을 지정합니다.
    • -salt: 암호화 시 무작위 데이터를 추가하여, 동일한 메시지라도 암호화될 때마다 결과가 다르게 보이도록 하여 보안을 강화합니다.
    • -in secret.txt: 원본 메시지가 담긴 입력 파일의 이름을 지정합니다.
    • -out secret.enc: 암호화된 결과물을 저장할 파일 이름을 지정합니다.
    • -pbkdf2: Password-Based Key Derivation Function 2 를 사용하여 비밀번호로부터 암호화 키를 안전하게 생성합니다.
  3. 이 명령어를 실행하면 OpenSSL 이 비밀번호를 생성하고 확인하라는 메시지를 표시합니다. 이 비밀번호는 다음과 같은 이유로 매우 중요합니다.

    • 실제 암호화 키를 생성하는 기반이 됩니다.
    • 나중에 파일을 복호화할 때 입력한 것과 정확히 일치하는 비밀번호가 필요합니다.
    • 암호화된 데이터의 보안 수준은 이 비밀번호의 복잡성에 달려 있습니다.

    주의: 비밀번호를 입력할 때 터미널에 아무런 글자도 표시되지 않습니다. 이는 리눅스 시스템의 일반적인 보안 동작입니다. 당황하지 말고 신중하게 입력한 후 Enter 를 누르세요.

  4. 암호화가 완료되면 다음 명령어로 암호화된 파일이 존재하는지 확인합니다.

    ls -l secret.enc

    파일 목록과 상세 정보가 표시됩니다. secret.enc 파일의 크기가 0 이 아니라면 암호화가 성공적으로 이루어진 것입니다.

  5. 암호화된 내용을 직접 확인해 보세요.

    cat secret.enc

    이제 데이터가 암호화된 이진 형식으로 변환되었기 때문에 터미널에는 알 수 없는 무작위 문자들이 출력될 것입니다. 이는 암호화가 어떻게 읽을 수 있는 데이터를 적절한 복호화 키 없이는 의미를 알 수 없는 안전한 암호문으로 바꾸는지 잘 보여줍니다.

메시지 복호화하기

이제 secret.enc에 저장된 암호화된 메시지를 다시 원래의 메시지로 되돌릴 차례입니다. 복호화는 앞서 뒤섞어 놓은 텍스트를 특별한 열쇠를 사용하여 잠금 해제하는 것과 같습니다. 암호화할 때 올바른 비밀번호가 필요했듯이, 복호화를 성공적으로 마치려면 정확히 동일한 비밀번호가 필요합니다.

  1. 복호화 명령어는 암호화 명령어와 구조가 비슷하지만 몇 가지 중요한 차이점이 있습니다. 터미널에 다음 명령어를 입력하세요.

    openssl enc -aes-256-cbc -d -in secret.enc -out decrypted.txt -pbkdf2

    명령어의 각 부분을 주의 깊게 살펴보겠습니다.

    • -d: OpenSSL 을 복호화 (decryption) 모드로 전환하는 핵심 플래그입니다.
    • -in secret.enc: 암호화된 파일을 입력 파일로 지정합니다.
    • -out decrypted.txt: 복구된 메시지를 저장할 파일 이름을 지정합니다.
    • 나머지 매개변수들 (-aes-256-cbc, -pbkdf2) 은 암호화할 때 사용한 것과 정확히 일치해야 합니다.
  2. 명령어를 실행하면 OpenSSL 이 비밀번호를 요구합니다. 이것이 보안 확인 단계입니다. 암호화 시 사용했던 것과 동일한 비밀번호를 입력해야 합니다. 다음 사항을 유의하세요.

    • 입력하는 동안 비밀번호 필드는 빈 칸으로 유지됩니다 (보안을 위한 정상 동작).
    • 비밀번호가 조금이라도 다르면 내용을 읽을 수 없는 결과가 나옵니다.
    • 시스템은 비밀번호가 틀렸다고 경고해 주지 않을 수도 있으며, 단순히 복호화에 실패하게 됩니다.
  3. 복호화에 성공했다면 결과를 확인해야 합니다. cat 명령어를 사용하여 복호화된 파일의 내용을 확인하세요.

    cat decrypted.txt

    터미널에 우리가 익히 알고 있는 메시지인 "LabEx has the best labs for fun, hands-on learning."이 출력되어야 합니다.

  4. 복호화가 완벽하게 이루어졌는지 확실히 검증하기 위해, diff 명령어를 사용하여 원본 파일과 복호화된 파일을 바이트 단위로 비교할 수 있습니다.

    diff secret.txt decrypted.txt

    diff 명령어 실행 후 아무런 출력도 나오지 않는 것이 가장 좋은 결과입니다. 이는 두 파일의 내용이 한 글자도 틀리지 않고 완벽하게 일치함을 의미합니다. 만약 어떤 텍스트라도 출력된다면 복호화 과정이 완전히 성공하지 못한 것입니다.

키 관리의 중요성 이해하기

마지막 단계에서는 암호화 키 (또는 비밀번호) 를 안전하게 보관하는 것이 왜 그토록 중요한지 알아보겠습니다. 암호화 키는 디지털 자물쇠와 같습니다. 데이터를 뒤섞어 보호하고, 오직 올바른 키로만 이를 되돌릴 수 있게 합니다. 아무리 강력한 암호화 알고리즘을 사용하더라도 키 관리가 제대로 되지 않으면 무용지물이 됩니다.

이번에는 일부러 틀린 비밀번호를 사용하여 파일을 복호화해 보겠습니다. 이 시연을 통해 키 관리에 실패했을 때 어떤 일이 벌어지는지 확인할 수 있습니다. 터미널에서 다음 명령어를 실행하세요.

openssl enc -aes-256-cbc -d -in secret.enc -out wrong.txt -pbkdf2

비밀번호 입력 요청이 오면, 암호화할 때 사용했던 것과 다른 비밀번호를 의도적으로 입력해 보세요. 이는 비밀번호를 잊어버렸거나 권한이 없는 사람이 데이터에 접근하려는 상황을 가정한 것입니다. 이제 결과를 확인해 봅시다.

cat wrong.txt

오류 메시지가 나타나거나 무작위 문자들이 깨져서 보일 것입니다. 이 결과는 두 가지 중요한 사실을 보여줍니다. 첫째, OpenSSL 이 암호화를 제대로 수행했다는 점 (비밀번호 없이는 데이터에 접근할 수 없음) 과 둘째, 정확한 비밀번호 없이는 암호화된 데이터가 완벽하게 보안을 유지한다는 점입니다.

이 간단한 실험은 암호학의 몇 가지 핵심 원칙을 보여줍니다. 암호화 알고리즘 (여기서는 AES-256-CBC) 은 키에 완전히 의존하도록 설계되었습니다. 비밀번호에서 단 한 글자만 달라도 완전히 다른 결과가 나옵니다. 실제 환경에서 이는 다음과 같은 의미를 갖습니다.

  1. 암호화 키는 암호화된 데이터와 분리하여 안전하게 보관해야 합니다.
  2. 암호화에는 강력하고 고유한 비밀번호를 사용해야 합니다.
  3. 키 관리 시스템에는 대개 백업 절차가 포함되어야 합니다.
  4. 기업 환경에서는 키를 주기적으로 교체 (순환) 합니다.

암호화된 데이터의 보안은 키 관리 습관만큼만 강력하다는 점을 기억하세요. 금고 비밀번호를 포스트잇에 적어 금고에 붙여두지 않는 것처럼, 암호화 키를 어떻게 저장하고 보호할지 신중하게 생각해야 합니다.

요약

이 실습에서는 기본적인 암호화 작업을 위해 OpenSSL 을 설치하고 사용하는 방법을 배웠습니다. 대칭 키 암호화 개념을 탐구하고, 파일을 직접 암호화 및 복호화해 보면서 안전한 키 관리의 중요성을 이해했습니다.

이 실습 경험을 통해 현대 데이터 보안의 기초가 되는 핵심 암호학 원칙을 접해 보았습니다. 개인 데이터 보호든 전문적인 역량 개발이든, 여기서 배운 기술은 향후 사이버 보안 분야를 더 깊이 탐구하는 데 튼튼한 토대가 될 것입니다.