암호화 및 복호화 모듈 - 해시 함수

이번에는 암호화 및 복호화 모듈인 해시 함수에 대해 알아봅시다!

 


1. 해시 함수

해시 함수란? 입력 데이터고정 길이의 해시 값으로 변환하는 암호화 모듈입니다.

주로 데이터의 무결성을 확인하거나 비밀번호 저장, 디지털 서명 등에 사용됩니다.

해시 함수입력 데이터의 크기와 상관없이 항상 같은 길이의 해시 값만 생성하며, 해시 값에서 원래 데이터를 복원할 수 없어요..

 

해시 함수의 종류로는 다음과 같이 있습니다.

 

1-1. MD5(Message-Digest Algorithm)

MD5입력 데이터128bit(16byte)의 해시 값으로 변환합니다.

또한, 고정된 32자리16진수 문자열로 출력됩니다.

하지만, 현재는 보안 취약점으로 인해 비밀번호 저장 or 데이터 무결성 검증 등의 용도로는 사용을 피하는 것이 좋아요..

 

사용 방법은 다음과 같습니다. (java.security 패키지의 MessageDigest 클래스 사용)

MD5.java

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

public class MD5Example {
    public static void main(String[] args) {
        String input = "MD5 Test";
        String md5Hash = getMD5Hash(input);
        System.out.println("MD5 해시: " + md5Hash);
    }

    public static String getMD5Hash(String input) {
        try {
            // MessageDigest 인스턴스 생성
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 입력 문자열의 바이트 배열 계산
            byte[] messageDigest = md.digest(input.getBytes());
            // 바이트 배열을 16진수 문자열로 변환
            StringBuilder hexString = new StringBuilder();
            for (byte b : messageDigest) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}

 

1-2. SHA-1(Secure Hash Algorithm 1)

SHA-1암호학적 해시 함수1995년에 발표되었습니다.

주로 데이터의 무결성을 검증하는 데 사용되며, 160bit(20byte)의 해시 값을 생성합니다.

또한, 입력 데이터가 조금만 변경되어도 완전히 다른 해시 값을 생성하는 특성을 가지고 있어요.

하지만, 현재는 여러 가지 보안 취약점이 발견되어 사용하지 않는 것을 권장하고 있어요.


사용 방법은 다음과 같습니다. (java.security 패키지의 MessageDigest 클래스 사용)

SHA-1.java

import java.security.MessageDigest;

public class SHA1Example {
    public static void main(String[] args) {
        try {
            // 해시할 데이터
            String data = "SHA-1 Test";

            // SHA-1 해시 객체 생성
            MessageDigest md = MessageDigest.getInstance("SHA-1");

            // 데이터 업데이트
            md.update(data.getBytes("UTF-8"));

            // 해시 값 생성
            byte[] hashBytes = md.digest();

            // 해시 값을 16진수로 변환
            StringBuilder hexString = new StringBuilder();
            for (byte b : hashBytes) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }

            // 결과 출력
            System.out.println("SHA-1 해시 값: " + hexString.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

1-3. SHA-2(Secure Hash Algorithm 2)

SHA-2 SHA-1의 후속 해시 알고리즘으로, 더 높은 보안성을 제공합니다.

일반적인 SHA-2 SHA-256 SHA-512입니다. 이들은 각각 256bit512bit해시 값을 생성해요.

 

사용 방법은 다음과 같습니다. (java.security 패키지의 MessageDigest 클래스 사용)

SHA-256.java

import java.security.MessageDigest;

public class SHA256Example {
    public static void main(String[] args) {
        try {
            // 해시할 데이터
            String data = "SHA-256 Test";

            // SHA-256 해시 객체 생성
            MessageDigest md = MessageDigest.getInstance("SHA-256");

            // 데이터 업데이트
            md.update(data.getBytes("UTF-8"));

            // 해시 값 생성
            byte[] hashBytes = md.digest();

            // 해시 값을 16진수로 변환
            StringBuilder hexString = new StringBuilder();
            for (byte b : hashBytes) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }

            // 결과 출력
            System.out.println("SHA-256 해시 값: " + hexString.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

SHA-512.java

import java.security.MessageDigest;

public class SHA512Example {
    public static void main(String[] args) {
        try {
            // 해시할 데이터
            String data = "SHA-512 Test";

            // SHA-512 해시 객체 생성
            MessageDigest md = MessageDigest.getInstance("SHA-512");

            // 데이터 업데이트
            md.update(data.getBytes("UTF-8"));

            // 해시 값 생성
            byte[] hashBytes = md.digest();

            // 해시 값을 16진수로 변환
            StringBuilder hexString = new StringBuilder();
            for (byte b : hashBytes) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }

            // 결과 출력
            System.out.println("SHA-512 해시 값: " + hexString.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

1-4. SHA-3(Secure Hash Algorithm 3)

SHA-3SHA-2의 후속으로, Keccak 알고리즘을 기반으로 한 새로운 해시 함수입니다.

이는 SHA-2와는 다른 구조와 보안성을 가지고 있으며, 다양한 해시 길이(224, 256, 384, 512bit)를 지원합니다.

또한, 암호화, 데이터 무결성 검증 등 다양한 분야에서 사용할 수 있어요.


사용 방법은 다음과 같습니다. (java.security 패키지의 MessageDigest 클래스 사용)

SHA-3-256.java

import java.security.MessageDigest;

public class SHA3Example {
    public static void main(String[] args) {
        try {
            // 해시할 데이터
            String data = "SHA-3-256 Test";

            // SHA-3-256 해시 객체 생성
            MessageDigest md = MessageDigest.getInstance("SHA3-256");

            // 데이터 업데이트
            md.update(data.getBytes("UTF-8"));

            // 해시 값 생성
            byte[] hashBytes = md.digest();

            // 해시 값을 16진수로 변환
            StringBuilder hexString = new StringBuilder();
            for (byte b : hashBytes) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }

            // 결과 출력
            System.out.println("SHA3-256 해시 값: " + hexString.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

SHA-3-512.java

import java.security.MessageDigest;

public class SHA3Example {
    public static void main(String[] args) {
        try {
            // 해시할 데이터
            String data = "SHA-3-512 Test";

            // SHA-3-512 해시 객체 생성
            MessageDigest md = MessageDigest.getInstance("SHA3-512");

            // 데이터 업데이트
            md.update(data.getBytes("UTF-8"));

            // 해시 값 생성
            byte[] hashBytes = md.digest();

            // 해시 값을 16진수로 변환
            StringBuilder hexString = new StringBuilder();
            for (byte b : hashBytes) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }

            // 결과 출력
            System.out.println("SHA3-512 해시 값: " + hexString.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 


2. 정리하며

지금까지 해시 함수에 대해 알아보았습니다.

이를 활용하여, 평문을 암호화, 비밀번호 저장, 디지털 서명 등에 사용할 수 있을 것 같아요.

 

참고

웅로그 님의 해시 함수의 종류

siAhn 님의 [자료구조] 해시(Hash)란? - (1) 개념, 충돌, 예시, 알고리즘