암호화를 통한 데이터 무결성 및 진위성 보장

CompTIABeginner
지금 연습하기

소개

디지털 세계에서 데이터가 변조되지 않았는지 (무결성) 그리고 신뢰할 수 있는 출처에서 왔는지 (인증) 를 보장하는 것은 매우 중요합니다. 암호학은 이러한 목표를 달성하기 위한 도구를 제공합니다.

이 실습에서는 Linux 시스템에서 기본적인 암호화 관행을 소개합니다. 다음 내용을 배우게 됩니다:

  • 해싱 (Hashing): 파일의 고유하고 고정된 크기의 "지문"을 생성합니다. 파일이 단 한 비트라도 변경되면 해시 값은 완전히 달라집니다. MD5 및 SHA256 알고리즘을 사용할 것입니다.
  • 디지털 서명 (Digital Signatures): 개인 키를 사용하여 파일에 "서명"하면, 해당 공개 키를 가진 누구나 파일이 인증되었고 수정되지 않았음을 확인할 수 있습니다.
  • 암호화 (Encryption): 파일의 내용을 스크램블링하여 올바른 복호화 키를 가진 사람만이 읽을 수 있도록 하여 기밀성을 보장합니다.

md5sum, sha256sum 및 GnuPG (gpg) 를 포함한 표준 Linux 명령줄 도구를 사용할 것입니다. GnuPG 는 Pretty Good Privacy (PGP) 표준의 GNU 구현입니다. 이 실습이 끝나면 자신 있게 파일을 해싱, 서명, 검증, 암호화 및 복호화할 수 있게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 94%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

파일 해시 계산 (MD5 및 SHA256)

이 단계에서는 파일의 암호화 해시를 계산하는 방법을 배웁니다. 해시 함수는 입력 (파일 등) 을 받아 해시 값 또는 다이제스트 (digest) 라고 알려진 고정된 크기의 바이트 문자열을 반환합니다. 이 값은 디지털 지문 역할을 합니다.

먼저, ~/project 디렉토리에 미리 생성된 important_data.txt 파일의 MD5 해시를 계산하기 위해 md5sum 명령을 사용합니다.

터미널에서 다음 명령을 실행하세요:

md5sum important_data.txt

해시 값과 파일 이름으로 구성된 출력을 보게 될 것입니다:

d9e21981521545759153147864347199  important_data.txt

MD5 는 빠르지만, 취약점 때문에 현재 암호화 목적으로는 안전하지 않은 것으로 간주됩니다. 더 안전하고 일반적으로 사용되는 대안은 SHA-2 계열, 특히 SHA256 입니다.

이제 sha256sum 명령을 사용하여 SHA256 해시를 계산해 보겠습니다:

sha256sum important_data.txt

출력은 더 길고 안전한 해시가 될 것입니다:

a39b2c414f234246a2535321238863141b1a4849443b9992994b4189317e8591  important_data.txt

important_data.txt의 내용을 조금이라도 변경하면 MD5 및 SHA256 해시 모두 완전히 달라지므로, 무단 변경 사항을 쉽게 감지할 수 있습니다.

GnuPG (GPG) 설치 및 구성

이 단계에서는 디지털 서명 및 암호화에 사용할 도구인 GnuPG(GPG) 를 설치합니다. GPG 는 최신 Linux 배포판에 종종 사전 설치되어 있지만, 설치되어 있고 최신 상태인지 확인하는 것이 좋습니다.

먼저 apt-get update를 사용하여 패키지 목록을 업데이트합니다. 패키지 관리는 관리자 권한이 필요하므로 sudo를 사용해야 합니다.

sudo apt-get update

다음으로 gnupg 패키지를 설치합니다. -y 플래그는 모든 프롬프트에 자동으로 "yes"로 응답하여 설치를 비대화형으로 만듭니다.

sudo apt-get install -y gnupg

설치가 완료된 후, 버전 확인을 통해 GPG 가 올바르게 설치되었는지 확인할 수 있습니다.

gpg --version

다음과 유사한 출력이 표시되어 설치가 확인될 것입니다. 버전 번호와 세부 정보는 약간 다를 수 있습니다.

gpg (GnuPG) 2.2.27
libgcrypt 1.9.4
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /home/labex/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

이제 GPG 가 준비되었으므로 자체 암호화 키를 생성할 수 있습니다.

디지털 서명을 위한 GPG 키 쌍 생성

이 단계에서는 개인 키와 공개 키로 구성된 자체 GPG 키 쌍을 생성합니다.

  • 개인 키 (Private Key): 비밀로 유지해야 합니다. 메시지를 해독하고 디지털 서명을 생성하는 데 사용됩니다.
  • 공개 키 (Public Key): 자유롭게 공유할 수 있습니다. 자신에게 보내는 메시지를 암호화하고 디지털 서명을 확인하는 데 사용됩니다.

일반적으로 gpg --full-generate-key는 대화형 설정을 실행합니다. 실험실 환경에서 이 프로세스를 더 간단하고 비대화형으로 만들기 위해 GPG 의 배치 모드를 사용하겠습니다. 먼저 키에 대한 세부 정보를 지정하는 매개변수 파일을 생성합니다.

"here document"와 함께 다음 cat 명령을 사용하여 gen-key-params 파일을 즉시 생성합니다:

cat << EOF > gen-key-params
%echo Generating a basic key
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: LabEx User
Name-Email: user@labex.io
Expire-Date: 0
%no-protection
%commit
%echo done
EOF

이 파일은 GPG 에 "LabEx User"라는 이름과 "user@labex.io" 이메일을 가진 사용자를 위한 2048 비트 RSA 키를 생성하도록 지시합니다. 키는 만료되지 않으며, 단순화를 위해 암호 구문 없이 키를 생성하기 위해 %no-protection을 사용합니다 (실제 시나리오에서는 항상 강력한 암호 구문을 사용해야 합니다).

이제 매개변수 파일을 사용하여 키를 생성합니다:

gpg --batch --gen-key gen-key-params

GPG 는 매개변수를 사용하여 키 쌍을 생성합니다. 이 작업은 몇 분 정도 걸릴 수 있습니다. 완료되면 키를 나열하여 키 쌍이 성공적으로 생성되었는지 확인할 수 있습니다.

gpg --list-keys

출력에는 새로 생성된 공개 키가 다음과 유사하게 표시되어야 합니다:

/home/labex/.gnupg/pubring.kbx
-------------------------------
pub   rsa2048 2023-10-27 [SC]
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uid           [ultimate] LabEx User <user@labex.io>
sub   rsa2048 2023-10-27 [E]

이제 파일 서명 및 암호화에 사용할 수 있는 GPG 키 쌍이 준비되었습니다.

GPG 로 파일 디지털 서명 및 검증

이 단계에서는 개인 키를 사용하여 파일에 대한 디지털 서명을 생성합니다. 이 서명은 파일이 귀하로부터 비롯되었으며 서명 이후 변경되지 않았음을 증명합니다.

원본 파일을 그대로 유지할 수 있어 유용한 "분리형 (detached)" 서명을 생성할 것입니다.

important_data.txt에 서명하려면 다음 명령을 실행합니다. GPG 는 방금 생성한 기본 개인 키를 자동으로 사용합니다.

gpg --detach-sign important_data.txt

암호 구문 없이 키를 생성했으므로 암호 구문을 묻는 메시지가 표시되지 않습니다. 이제 디렉토리의 파일을 나열하여 새 서명 파일을 확인합니다.

ls

원본 파일과 해당 서명을 볼 수 있습니다:

gen-key-params  important_data.txt  important_data.txt.sig

이제 important_data.txtimportant_data.txt.sig를 모두 받고 공개 키도 가진 수신자라고 가정해 봅시다. 파일의 진위성과 무결성을 확인하기 위해 gpg --verify 명령을 실행할 것입니다.

직접 검증을 수행해 보겠습니다:

gpg --verify important_data.txt.sig important_data.txt

출력에서 서명이 유효함을 확인할 수 있습니다:

gpg: Signature made Mon Aug  4 16:39:30 2025 CST
gpg:                using RSA key 8765265B14E42532B9CBAE6DE2120C9784C69814
gpg: Good signature from "LabEx User <user@labex.io>" [ultimate]

"Good signature" 메시지는 파일이 정품이며 수정되지 않았음을 확인합니다.

GPG 로 파일 암호화 및 복호화

이 단계에서는 기밀성을 위해 파일을 암호화하는 방법을 배웁니다. 서명 (개인 키 사용) 과 달리, 다른 사람을 위해 파일을 암호화하려면 해당 사람의 공개 키가 필요합니다. 수신자는 자신의 개인 키를 사용하여 이를 복호화합니다.

여기서는 우리 자신을 위해 important_data.txt를 암호화할 것이므로, 수신자의 키로 우리 자신의 공개 키를 사용할 것입니다.

파일을 암호화하려면 다음 명령을 사용합니다. --recipient 플래그는 암호화에 사용할 공개 키를 지정하고, --output은 암호화된 파일의 이름을 정의합니다.

gpg --encrypt --recipient "user@labex.io" --output important_data.txt.gpg important_data.txt

새 암호화된 파일인 important_data.txt.gpg의 내용을 보려고 하면 읽을 수 없는 이진 데이터가 표시됩니다.

cat important_data.txt.gpg

이제 파일을 복호화해 보겠습니다. 이 작업에는 해당 개인 키가 필요합니다. 개인 키를 가지고 있으므로 메시지를 복호화할 수 있습니다. 복호화된 내용을 decrypted_data.txt라는 새 파일에 저장할 것입니다.

gpg --decrypt --output decrypted_data.txt important_data.txt.gpg

GPG 는 개인 키를 사용하여 파일을 복호화합니다. 터미널에 GPG 에서 일부 정보가 표시되며, 파일이 귀하의 키로 암호화되었다는 확인 메시지도 포함됩니다.

마지막으로, 복호화된 파일의 내용을 확인하여 프로세스가 성공했는지 확인합니다.

cat decrypted_data.txt

출력은 원본의 읽기 가능한 메시지여야 합니다:

This is a secret message that needs to be protected.

파일의 내용을 보호하기 위해 성공적으로 암호화한 다음 원본 정보를 검색하기 위해 복호화했습니다.

요약

이 실습에서는 Linux 시스템에서 필수적인 암호화 도구 및 개념에 대한 실습 경험을 쌓았습니다. 다음 작업을 성공적으로 수행했습니다.

  • 데이터 무결성을 보장하기 위해 md5sumsha256sum을 사용하여 파일 해시를 계산했습니다.
  • 오픈 소스 암호화의 표준 도구인 GnuPG (gpg) 를 설치하고 구성했습니다.
  • 개인 GPG 키 쌍 (공개 키 및 개인 키) 을 생성했습니다.
  • 진위성과 무결성을 제공하기 위해 gpg --detach-sign으로 디지털 서명을 생성했습니다.
  • gpg --verify로 디지털 서명을 검증했습니다.
  • gpg --encrypt를 사용하여 기밀성을 위해 파일을 암호화했습니다.
  • gpg --decrypt를 사용하여 파일을 복호화하여 원본 콘텐츠에 액세스했습니다.

이러한 기술은 다양한 전문 및 개인적 맥락에서 데이터를 보호하고, 소프트웨어 다운로드를 검증하며, 통신을 보호하는 데 기본이 됩니다.