암호학에서 SHA-256 을 이용한 해싱

LinuxBeginner
지금 연습하기

소개

암호학의 세계에 오신 것을 환영합니다! 이 실습에서는 현대 보안의 가장 근본적인 개념 중 하나인 암호화 해싱 (cryptographic hashing) 에 대한 실질적인 경험을 쌓게 될 것입니다. 구체적으로 SHA-256 알고리즘을 다룰 것입니다.

암호화 해시 함수는 임의의 크기를 가진 입력 (또는 '메시지') 을 받아 고정된 크기의 바이트 문자열을 반환하는 수학적 알고리즘입니다. 이 출력은 일반적으로 '다이제스트 (digest)' 또는 '해시 (hash)'라고 합니다. 예를 들어, SHA-256 은 항상 256 비트 (32 바이트) 해시를 생성합니다.

이러한 함수에는 몇 가지 중요한 속성이 있습니다.

  • 결정론적 (Deterministic): 동일한 입력은 항상 동일한 출력을 생성합니다.
  • 단방향성 (One-way): 해시로부터 원래 입력을 찾아내기 위해 함수를 역으로 되돌리는 것은 계산적으로 불가능합니다.
  • 눈사태 효과 (Avalanche Effect): 입력의 작은 변화 (예: 단일 문자 변경) 는 극적으로 다른 출력 해시를 생성합니다.

이 실습 전반에 걸쳐 openssl 명령줄 도구와 간단한 Python 스크립트를 사용하여 이러한 속성을 탐색하고 파일 무결성 확인 및 비밀번호 보안과 같은 실제 시나리오에서 해싱이 어떻게 사용되는지 이해하게 될 것입니다.

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

해시 함수의 속성

이 단계에서는 openssl 명령줄 도구를 사용하여 해시 함수의 두 가지 핵심 속성인 결정론적 특성과 눈사태 효과를 탐색합니다. 함수가 결정론적이라는 것은 동일한 입력이 항상 동일한 출력을 생성한다는 것을 의미합니다. 눈사태 효과는 입력의 아주 작은 변화가 완전히 다른 출력 해시를 초래한다는 것을 의미합니다.

먼저, 문자열 "hello"에 대한 SHA-256 해시를 생성해 보겠습니다. 문자열을 openssl로 전달하기 위해 echo 명령을 사용할 것입니다.

echo -n "hello" | openssl dgst -sha256

echo-n 플래그는 중요합니다. 이는 echo가 문자열 끝에 줄 바꿈 문자 (newline character) 를 추가하는 것을 방지하여 결과 해시가 변경되는 것을 막아줍니다.

다음과 유사한 출력을 보게 될 것입니다.

SHA2-256(stdin)= 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

이제 결정론적 속성을 시연하기 위해 정확히 동일한 명령을 다시 실행해 보겠습니다.

echo -n "hello" | openssl dgst -sha256

출력이 동일하다는 점에 유의하십시오. 이는 동일한 입력에 대해 SHA-256 해시는 항상 같다는 것을 확인시켜 줍니다.

SHA2-256(stdin)= 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

다음으로 눈사태 효과를 시연해 보겠습니다. 입력 문자열을 매우 작게 변경하여 "hello"를 "Hello"(첫 글자가 대문자) 로 바꿔보겠습니다.

echo -n "Hello" | openssl dgst -sha256

새로운 해시를 관찰하십시오.

SHA2-256(stdin)= 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969

이 해시를 "hello"에 대한 해시와 비교해 보십시오. 입력의 비트가 하나만 변경되었음에도 불구하고 (첫 글자의 대소문자 변경), 결과 해시는 완전히 다릅니다. 이것이 바로 눈사태 효과이며, 안전한 해시 함수의 중요한 특징입니다.

파일 해시 계산

이 단계에서는 텍스트 파일의 SHA-256 해시를 계산합니다. 이는 파일 무결성을 확인하는 데 사용되는 일반적인 관행입니다. 인터넷에서 파일을 다운로드할 때 웹사이트는 종종 다운로드 중 파일이 손상되거나 변조되지 않았는지 확인할 수 있도록 체크섬 (해시) 을 제공합니다.

이 실습을 위한 설정 스크립트는 이미 현재 디렉터리 (~/project) 에 message.txt라는 파일을 생성했습니다. 먼저 cat 명령을 사용하여 파일 내용을 확인해 보겠습니다.

cat message.txt

다음과 같은 내용을 보게 될 것입니다.

This is a secret message.

이제 이 파일의 SHA-256 해시를 계산해 보겠습니다. 구문은 이전에 사용했던 것과 유사하지만, 입력을 파이프 (pipe) 하는 대신 openssl dgst 명령에 파일 이름을 인수로 제공합니다.

openssl dgst -sha256 message.txt

명령이 파일을 처리하고 SHA-256 해시를 출력할 것입니다. 출력은 다음과 같이 보일 것입니다.

SHA2-256(message.txt)= 6432f513cfd40d47c8584494c0524468257e50dc1a0422f73becac85189543f8

이 해시는 현재 message.txt 내용에 대한 고유한 디지털 지문 역할을 합니다. 나중에 보게 되겠지만, 파일의 단일 문자라도 변경되면 해시는 완전히 변경됩니다.

다중 해시 생성

이 단계에서는 다양한 문자열 입력에 대한 SHA-256 해시 생성을 더 연습하게 됩니다. 이는 고유한 입력이 어떻게 고유한 해시를 생성하는지에 대한 이해를 강화하는 데 도움이 될 것입니다. 우리는 계속해서 echo -n 명령을 openssl로 파이프하여 추가 문자 없이 문자열 자체만 해싱하고 있는지 확인할 것입니다.

먼저, 문자열 "labex"에 대한 해시를 생성해 보겠습니다.

echo -n "labex" | openssl dgst -sha256

출력은 "labex"에 대한 SHA-256 해시가 될 것입니다.

SHA2-256(stdin)= 679e75b679886c5eaf8aaab88ddfc0181e6dae14cff346db8ba398bd7b2e31fe

다음으로, 고유한 해시를 확인하기 위해 다른 문자열인 "crypto"를 시도해 보겠습니다.

echo -n "crypto" | openssl dgst -sha256

예상대로, 이는 완전히 다른 해시를 생성합니다.

SHA2-256(stdin)= da2f073e06f78938166f247273729dfe465bf7e46105c13ce7cc651047bf0ca4

이 실습은 데이터의 크기나 양에 관계없이 모든 고유한 데이터 조각이 자체적인 고유한 해시 값을 가진다는 것을 보여줍니다. 이 속성은 해시가 데이터 검증, 블록체인 기술 및 디지털 서명에 사용되는 방식의 근간이 됩니다.

충돌 저항성 시연

이 단계에서는 message.txt 파일을 약간 수정하고 해시가 어떻게 변하는지 확인하여 눈사태 효과 (avalanche effect) 와 충돌 저항성 (collision resistance) 개념을 직접 관찰하게 됩니다. 충돌 저항성은 동일한 해시를 생성하는 두 개의 다른 입력 (input) 을 찾는 것이 극도로 어렵다는 것을 의미합니다.

먼저, 원래 message.txt 파일의 해시를 다시 계산하여 기억을 되살려 보겠습니다.

openssl dgst -sha256 message.txt

원래 해시가 다시 표시될 것입니다.

SHA2-256(message.txt)= 6432f513cfd40d47c8584494c0524468257e50dc1a0422f73becac85189543f8

이제 파일에 아주 작은 변경을 가해 보겠습니다. 파일 끝에 단일 마침표 (.) 를 추가할 것입니다. 이는 echo 명령과 >> 리디렉션 연산자를 사용하여 출력 내용을 파일에 추가함으로써 쉽게 수행할 수 있습니다.

echo "." >> message.txt

파일 내용을 다시 확인하여 변경 사항이 적용되었는지 확인할 수 있습니다.

cat message.txt

끝에 마침표가 있는 것을 볼 수 있습니다.

This is a secret message.
.

이제 수정된 파일을 다시 해시해 보겠습니다.

openssl dgst -sha256 message.txt

새로운 해시는 다음과 같습니다.

SHA2-256(message.txt)= 4106e1c985a4ee1754fff76b8bffda0c4844679885cb70758f24cd43e771daac

이 새로운 해시를 원래 해시와 비교해 보십시오. 완전히 다릅니다. 이 강력한 시연은 파일의 단 한 글자 변경만으로도 근본적으로 다른 해시가 생성되어 모든 형태의 변조를 쉽게 감지할 수 있음을 보여줍니다.

비밀번호 해시 생성

이 단계에서는 명령줄 (command line) 을 넘어 간단한 Python 스크립트를 작성하여 비밀번호를 해시해 보겠습니다. 비밀번호를 일반 텍스트로 저장하는 것은 심각한 보안 취약점입니다. 표준 관행은 비밀번호의 해시를 저장하는 것입니다. 사용자가 로그인하려고 시도하면 시스템은 입력한 비밀번호를 해시하여 저장된 해시와 비교합니다.

설정 스크립트에서 이미 hash_password.py라는 빈 파일을 생성했습니다. 이제 nano 텍스트 편집기를 사용하여 여기에 코드를 추가할 것입니다.

nano로 파일을 엽니다.

nano hash_password.py

이제 다음 Python 코드를 nano 편집기에 복사하여 붙여넣으십시오.

import hashlib

## The password we want to hash
password = "mysecretpassword"

## Hash functions in Python work on bytes, not strings.
## We must encode the string into bytes first, using UTF-8.
password_bytes = password.encode('utf-8')

## Create a new SHA-256 hash object.
sha256_hash = hashlib.sha256(password_bytes)

## Get the hexadecimal representation of the hash.
hex_digest = sha256_hash.hexdigest()

print(f"The password is: {password}")
print(f"The SHA-256 hash is: {hex_digest}")

이 스크립트는 다음 작업을 수행합니다.

  1. 다양한 해싱 알고리즘을 제공하는 hashlib 라이브러리를 가져옵니다.
  2. 비밀번호 문자열을 정의합니다.
  3. .encode('utf-8')를 사용하여 문자열을 바이트 (bytes) 로 인코딩합니다. 해시 함수는 바이트를 기반으로 작동하므로 이는 매우 중요한 단계입니다.
  4. SHA-256 해시 객체를 생성하고 비밀번호 바이트로 이를 업데이트합니다.
  5. .hexdigest()를 사용하여 최종 해시를 읽기 쉬운 16 진수 형식으로 가져옵니다.

코드를 붙여넣은 후, Ctrl+X를 누른 다음 Y를 누르고 Enter를 눌러 nano에서 파일을 저장하고 종료합니다.

마지막으로 터미널에서 Python 스크립트를 실행합니다.

python3 hash_password.py

스크립트가 실행되어 비밀번호와 해당 SHA-256 해시가 출력됩니다.

The password is: mysecretpassword
The SHA-256 hash is: 94aefb8be78b2b7c344d11d1ba8a79ef087eceb19150881f69460b8772753263

성공적으로 Python 을 사용하여 암호화 해싱 (cryptographic hashing) 을 수행했습니다. 이는 안전한 애플리케이션 개발에 필수적인 기술입니다.

요약

본 랩 (lab) 을 완료하신 것을 축하드립니다! SHA-256 암호화 해시 함수에 대한 실질적인 실습 경험을 쌓으셨습니다.

본 랩에서 다음 사항들을 학습했습니다.

  • 해시 함수의 핵심 속성: **결정론적 (deterministic)**이며, **단방향 (one-way)**이고, **눈사태 효과 (avalanche effect)**를 보인다는 점.
  • Linux 환경에서 openssl dgst -sha256 명령어를 사용하여 문자열과 파일 모두에 대한 해시를 계산하는 방법.
  • 파일 무결성 (file integrity) 검증 및 변조 감지를 위한 해싱의 중요성.
  • Python 의 hashlib 라이브러리를 사용하여 프로그래밍 방식으로 SHA-256 해시를 생성하는 방법. 이는 **비밀번호 보안 (password security)**에서 흔히 사용되는 작업입니다.

해싱은 현대 사이버 보안의 초석입니다. 여기서 연습한 기술들은 디지털 서명 (digital signatures), 메시지 인증 코드 (MACs, Message Authentication Codes), 블록체인 기술과 같은 보다 고급 주제를 이해하는 데 기본이 됩니다. 다음 단계로, 해싱 위에 추가적인 보안 계층을 더하는 비밀번호 "솔팅 (salting)"에 대해 조사해 볼 수 있습니다.