Encryption Algorithm

MD5 (Message Digest Algorithm 5) 해시

임베디드 친구 2024. 11. 29. 08:58
반응형

1. MD5란 무엇인가?

MD5(Message Digest Algorithm 5)는 1991년 미국의 Ron Rivest에 의해 개발된 해시 함수입니다. 주로 데이터의 무결성을 검사하거나 디지털 서명을 생성할 때 사용됩니다. MD5는 주어진 입력 데이터로부터 128비트(16바이트) 길이의 해시 값을 생성하며, 이 해시 값은 입력 데이터가 조금만 달라져도 완전히 달라지는 특징을 가지고 있습니다.

하지만 MD5는 보안성에 있어 심각한 결함이 발견되어 암호학적으로 안전한 목적에서는 더 이상 사용되지 않습니다. 그럼에도 불구하고, MD5는 여전히 체크섬 검증, 데이터 무결성 검사와 같은 비암호학적 용도로 사용되고 있습니다.

이 포스팅에서는 MD5 알고리즘의 원리를 설명하고, Java와 Linux C 언어로 MD5 해시 값을 생성하는 예제를 소개하려고 합니다.

2. MD5 알고리즘의 작동 원리

MD5 알고리즘은 입력 데이터를 512비트의 블록으로 나누어 처리합니다. 다음은 MD5 알고리즘의 주요 단계를 요약한 것입니다:

  1. 패딩(Padding): 입력 데이터의 길이를 512비트의 배수가 되도록 패딩을 추가합니다. 패딩은 '1' 비트를 추가한 후 '0' 비트들을 이어붙여 입력 데이터의 길이가 448비트가 되도록 맞춘 뒤, 나머지 64비트에는 원래 입력 데이터의 비트 길이를 저장합니다.
  2. 초기화: MD5 알고리즘은 4개의 32비트 레지스터를 사용합니다(A, B, C, D). 이 레지스터들은 다음과 같은 초기 값으로 설정됩니다:
    • A = 0x67452301
    • B = 0xEFCDAB89
    • C = 0x98BADCFE
    • D = 0x10325476
  3. 메인 알고리즘: 각 512비트 블록은 64번의 라운드를 거치며, 이 라운드에서 다양한 논리 연산과 가중치 값이 사용됩니다. 이 과정에서 A, B, C, D 레지스터는 지속적으로 업데이트되어 최종 해시 값으로 다가갑니다.
  4. 출력: 마지막으로 A, B, C, D 레지스터의 값을 이어붙여 128비트(16바이트) 길이의 해시 값을 생성합니다.

3. Java로 MD5 구현하기

Java에서 MD5 해시 값을 생성하려면 java.security 패키지의 MessageDigest 클래스를 사용할 수 있습니다. 다음은 Java로 MD5 해시를 생성하는 예제입니다:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Example {
    public static void main(String[] args) {
        String input = "Hello, World!";
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] hashBytes = md.digest(input.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : hashBytes) {
                sb.append(String.format("%02x", b));
            }
            System.out.println("MD5 hash: " + sb.toString());
        } catch (NoSuchAlgorithmException e) {
            System.err.println("MD5 algorithm not found.");
        }
    }
}

설명

  • MessageDigest.getInstance("MD5")를 사용하여 MD5 알고리즘을 가져옵니다.
  • digest() 메소드는 입력 데이터를 해시하여 바이트 배열로 반환합니다.
  • 각 바이트를 16진수 문자열로 변환하여 최종 해시 값을 출력합니다.

위의 코드는 "Hello, World!"라는 입력 문자열에 대한 MD5 해시 값을 출력합니다.

4. Linux C로 MD5 구현하기

Linux 환경에서 C 언어를 사용해 MD5 해시 값을 생성하려면 OpenSSL 라이브러리를 사용할 수 있습니다. 다음은 C 언어로 MD5 해시를 생성하는 예제입니다:

#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>

void print_md5_hash(unsigned char *hash) {
    for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
        printf("%02x", hash[i]);
    }
    printf("\n");
}

int main() {
    unsigned char digest[MD5_DIGEST_LENGTH];
    char string[] = "Hello, World!";

    MD5((unsigned char*)&string, strlen(string), (unsigned char*)&digest);

    printf("MD5 hash: ");
    print_md5_hash(digest);

    return 0;
}

설명

  • #include <openssl/md5.h>: OpenSSL 라이브러리의 MD5 함수들을 사용하기 위해 헤더 파일을 포함합니다.
  • MD5() 함수는 입력 데이터를 해시하여 결과를 digest 배열에 저장합니다.
  • print_md5_hash() 함수는 16진수 형식으로 해시 값을 출력합니다.

이 코드는 역시 "Hello, World!"라는 문자열에 대한 MD5 해시 값을 출력합니다.

5. MD5의 보안 문제

MD5는 한때 매우 널리 사용되었지만, 지금은 보안에 취약하다는 것이 알려져 더 이상 암호학적으로 안전한 용도로 사용되지 않습니다. 특히 충돌(같은 해시 값을 가지는 서로 다른 입력 데이터) 을 찾는 것이 상대적으로 쉬워졌기 때문에 디지털 서명이나 암호화된 데이터 검증과 같은 보안이 중요한 작업에서는 MD5 대신 SHA-256과 같은 더 안전한 알고리즘을 사용하는 것이 좋습니다.

그럼에도 MD5는 여전히 체크섬을 계산하거나 파일의 무결성을 확인하는 비보안적 용도로 사용될 수 있습니다. 예를 들어 파일 다운로드 시 파일이 손상되지 않았는지 확인하기 위해 MD5 해시 값을 제공하는 경우가 있습니다.

6. 마무리

이번 포스팅에서는 MD5 알고리즘의 개요와 작동 원리를 살펴보고, Java와 Linux C 언어로 MD5 해시 값을 생성하는 방법을 알아보았습니다. MD5는 과거에 널리 사용되었던 알고리즘이지만, 현재는 보안상 취약점이 있기 때문에 중요한 용도로는 적합하지 않습니다. 그러나 비보안적인 목적에서는 여전히 유용하게 활용될 수 있습니다.

반응형